SELECT FROM DB_TABLE с левым соединением, где столбец из объединенной таблицы - PullRequest
0 голосов
/ 10 апреля 2019

Я хочу создать выборку, которая объединяет несколько таблиц.

В следующем коде мне нужно выбрать только строки таблицы EKPO, где столбец EBELN = переменная lv_ebeln. Но как только я добавляю это условие к WHERE, я получаю следующую синтаксическую ошибку:

Элементы в списке «SELECT LIST» должны быть разделены запятыми.

Итак, есть ли способ добавить это условие?

DATA: BEGIN OF wa_itab,
        gjahr TYPE rseg-gjahr,
        ebelp TYPE ekpo-ebelp,
      END OF wa_itab,
      itab     LIKE TABLE OF wa_itab,
      lv_belnr TYPE rseg-belnr,
      lv_ebeln TYPE ekpo-ebeln.

SELECT rseg~gjahr ekpo~ebelp FROM rseg
  LEFT JOIN ekpo ON rseg~ebeln = ekpo~ebeln AND rseg~ebelp = ekpo~ebelp
  INTO (wa_itab-gjahr, wa_itab-ebelp )
  WHERE rseg~belnr = lv_belnr 
    AND ekpo~ebeln = lv_ebeln. " <=== SYNTAX ERROR because of this line

  ...
  " some other code
  ...

  APPEND wa_itab TO itab.
ENDSELECT.

1 Ответ

4 голосов
/ 10 апреля 2019

Сообщение об ошибке синтаксиса вводит в заблуждение, запятые не требуются, поскольку проблема не связана со строгим режимом OpenSQL .

Истинная ошибка заключается в том, что в левом внешнем соединении условие в правой таблице EKPO не принимается в WHERE, потому что если в результате объединения есть несколько строк только из левой таблицы RSEG, столбцы из правой таблицы EKPO будет иметь значение null, поэтому условия, основанные на столбцах правой таблицы, будут ложными, а строки не будут выбраны, поэтому левое внешнее соединение будет вести себя как внутреннее соединение.

  • Либо вы используете внутреннее соединение с условием в WHERE (что вам не нужно).
  • Или оставьте внешнее левое соединение и переместите условие в состояние соединения ON, как показано ниже.

Код:

SELECT rseg~gjahr ekpo~ebelp FROM rseg
  LEFT JOIN ekpo ON rseg~ebeln = ekpo~ebeln 
                AND rseg~ebelp = ekpo~ebelp
                AND ekpo~ebeln = lv_ebeln " <=== move it here
  INTO (wa_itab-gjahr, wa_itab-ebelp )
  WHERE rseg~belnr = lv_belnr.

PS: Я не нахожу ссылку в документации ABAP, которая бы это официально объясняла, за исключением того, что есть пример закрытия :

SELECT s~carrid, s~carrname 
   FROM scarr AS s 
   LEFT OUTER JOIN spfli AS p ON s~carrid   =  p~carrid 
                              AND p~cityfrom = @cityfr  " <=== not in the WHERE
   WHERE p~connid IS NULL 
   ORDER BY s~carrid, s~carrname 
   INTO TABLE @DATA(itab). 
...