ВЫБЕРИТЕ ОДИН ПРОТИВ ВЫБИРАЮТ ДО 1 СТРОКИ. - PullRequest
0 голосов
/ 23 мая 2018

Мы переезжаем в HANA, а сторонняя компания занимается исправлением кода.Некоторые из них автоматизированы.Я вижу, где было сделано это изменение кода:

*{   REPLACE        DEVK9A1ZZH
*  SELECT SINGLE maktx
*                INTO tab-maktx
*                FROM makt
*                WHERE matnr EQ strmatnr
*                AND   spras EQ sy-langu.
  SELECT maktx
    UP TO 1 ROWS
    INTO tab-maktx
    FROM makt
    WHERE matnr = strmatnr
    AND   spras = sy-langu ORDER BY maktx.
  ENDSELECT.

Я думал, SELECT SINGLE всегда предпочтительнее SELECT...UP TO 1 ROWS...ENDSELECT. и что ORDER BY ничего не делает, когда получается только одна запись.Кажется, они заменяют каждый SELECT SINGLE в нашем коде.Что в исходном коде моего коллеги не соответствует требованиям HANA?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Иногда это необходимо, в основном это не

В большинстве случаев это не нужно, как в вашем примере.

SELECT SINGLE s можно разделить на 3 группы:

  • Полный поиск по первичному ключу
  • Проверка существования
  • Другое

Полный поиск по первичному ключу

matnr и sprasполя первичного ключа таблицы makt, поэтому одна и та же строка уже возвращена, независимо от какого-либо порядка.
Я полагаю, что сторонний инструмент недостаточно совершенен для проверки полей ключа выбранной таблицы.

Проверка существования

Довольно много SELECT SINGLE используются только для проверки существования значений в БД.

SELECT SINGLE posnr
    FROM VBPA 
    WHERE vbeln = iv_vbeln

Нам все равно, какой номер элемента возвращается, просто если он больше 0. Преобразование здесь также не требуется, порядок не имеет значения.

Когда этополезно?

Только в третьем случае, когда у нас нет полного первичного ключа, но мы все еще заботимся о порядке.Это довольно редко.

Проверка на первичный ключ трудна, и совершенно невозможно определить, нуждался ли оригинальный программист в определенном порядке из кода.

Этот инструмент даст вам больше ложных срабатываний, чем полезных результатов.

0 голосов
/ 23 мая 2018

Городская легенда (и мой опыт, но я не могу доказать это) говорит, что обычные СУБД предоставляют строки, используя первичный ключ, просто потому, что именно так они хранят данные.HANA сортирует по столбцам, а не по строкам, поэтому, когда вы запрашиваете только одну строку, она возвращается к вам с первой строкой, которую "she" удается построить в соответствии с вашими условиями.

Поскольку вы не можете сделать SELECT SINGLE...ORDER BY, вы должны найти альтернативный способ:

  • рекомендуется: выполнить условие WHERE с достаточным количеством условий для получения строки, которая вам действительно нужна
  • попросить HANA смоделировать старую СУБДповедение, задавая «только одну строку, ища по первичному ключу»

Если вам удастся всегда предоставить предложение WHERE с достаточным количеством условий, вы можете продолжить с синтаксисом SINGLE, но я боюсь, что некоторыекомпании будут просить вас НЕ делать этого, потому что они столкнулись с результатами ленивых кодеров, которые полагались на старое поведение DMBS: (

...