LEFT JOIN and WHERE . ABAP SQL

В новом синтаксисе ABAP SQL  появилась возможность прописывать условия для таблиц LEFT JOIN  в WHERE.

Однако есть существенное отличие между условием прописанным после ON  и в условии WHERE.

Сначала посмотрим, что у нас выберется из таблиц MSPR  И VEPO  без дополнительных ограничений:

Мы видим, что для партии "0000004239" значение в таблице  vepo  не найдено вообще. Для партий  "0000004226", "0000004233",  "0000004237", "0000004460"  существуют записи в VEPO  с пустым значением поля SOBKZ.

Теперь сделаем дополнительное ограничение по VEPO-SOBKZ , при этом  из MSPR  выбираем все строки, что и раньше. Но  из  VEPO  выбираем только записи  с SOBKZ = 'Q'.

В полученном результате для партий "0000004237", "0000004233"  мы не нашли записи в VEPO  и эти строки вышли с пустым VBELN.  Все как и в старом синтаксисе.

Попробуем перенести условие SOBKZ = 'Q' в WHERE.

И мы увидим, что на выходе остались только строки с SOBKZ = 'Q'.

Как же так?

Все как  всегда скрывается в  хелпе)) Если мы ограничиваем результаты в WHERE,  исключение значений происходит  уже после LEFT JOIN. Т.е. сначала все отрабатывает как и в SELECT 1, но потом  все строки с SOBKZ <> 'Q'  удаляются из выборки.

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

 

Добавить комментарий

Ваш адрес email не будет опубликован.