ABAP: IN (суб-выбор) с кортежем - PullRequest
0 голосов
/ 24 октября 2018

Этот код работает приблизительно:

  select *
   into table <sub_result>
  from ADRC
  WHERE ADDRNUMBER
  in ( select ADRNRA from AUFK where (cond_string) )
  .

Но это не так:

  select *
   into table <sub_result>
  from ADRC
  WHERE (ADDRNUMBER, MANDT)
  in ( select ADRNRA, MANDT from AUFK where (cond_string) )
  .

AFAIK синтаксис кортежа (ADDRNUMBER, MANDT) является допустимым SQL.

Этонедопустимо в Open SQL ABAP?

Если синтаксис кортежа не разрешен, что я могу сделать?

Обновление

В Open SQL (Только SAP / ABAP) проверка столбца MANDT / CLIENT не требуется.Это выполняется ABAP, который анализирует Open SQL и создает собственный SQL.Вы входите в SAP с определенным клиентом, и автоматически добавляется «WHERE MANDT = THE_ID_YOU_USED_DURING_LOGIN».Это означает, что мой первоначальный вариант использования проще (один столбец в "WHERE COL IN (subselect)").Но тем не менее общий вопрос остается в силе.Спасибо всем большое за помощь!

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Чтобы завершить ответ Пелина, вот два возможных синтаксиса, в зависимости от версии ABAP:

DATA sflights TYPE TABLE OF sflight.

" Strict mode of OpenSQL (>= 7.40 SP 5 ; more syntaxes than old OpenSQL syntax)

SELECT * FROM sflight AS f INTO TABLE @sflights  " <== @ activates the strict mode
  WHERE NOT EXISTS ( SELECT 1 FROM sbook AS b    " <== 1 is possible in strict mode
        WHERE b~carrid = f~carrid
          AND b~connid = f~connid
          AND b~fldate = f~fldate ).

" "Loose" mode of OpenSQL (strict mode not used)

SELECT * FROM sflight AS f INTO TABLE sflights " <== no @ i.e. strict mode deactivated
  WHERE NOT EXISTS ( SELECT * FROM sbook AS b  " <== 1 is not possible
        WHERE b~carrid = f~carrid
          AND b~connid = f~connid
          AND b~fldate = f~fldate ).
0 голосов
/ 24 октября 2018

Нельзя использовать в течение нескольких столбцов.Попробуйте вот так:

select *
   into table <sub_result>
  from ADRC d
  WHERE exists ( select 1 from AUFK a where a~ADDRNUMBER = d~ADDRNUMBER  and a~MANDT = d~MANDT)
...