Выбор нескольких полей в подзапросе

Этот код ABAP работает:

  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) ).

Насколько мне известно, синтаксис кортежа (ADDRNUMBER, MANDT) действителен для SQL. Разве это не действует в Open SQL ABAP?

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

P.S. В Open SQL проверка MANDT не требуется, так что это всего лишь пример запроса.


person guettli    schedule 24.10.2018    source источник
comment
Делайте EXISTS вместо IN.   -  person jarlh    schedule 24.10.2018


Ответы (2)


Чтобы завершить ответ Пелина, вот два возможных синтаксиса, в зависимости от версии 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 ).
person Sandra Rossi    schedule 25.10.2018
comment
Дорогая Сандра Росси. Большое спасибо за Вашу помощь. Есть ли способ отправить вам букет цветов? Ваша помощь здесь, на StackOverlow, бесценна. - person guettli; 25.10.2018
comment
Спасибо, пожалуйста. Я предпочитаю правильно сформулированные вопросы StackOverflow — продолжайте! - person Sandra Rossi; 25.10.2018

Вы не можете использовать in для нескольких столбцов. Попробуйте так:

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)
person Pelin    schedule 24.10.2018
comment
в ABAP возникает синтаксическая ошибка, если вы используете . после псевдонима таблицы. Вместо этого вы должны использовать ~. - person Sandra Rossi; 24.10.2018
comment
Обратите внимание, если я прав: если вы используете select 1, то он работает только в строгом режиме OpenSQL, поэтому вы должны использовать @ перед переменными (@<sub_result>). В нестрогом режиме вы можете использовать WHERE exists ( select * - person Sandra Rossi; 24.10.2018
comment
только ~ (не ~.) - person Sandra Rossi; 24.10.2018
comment
@SandraRossi Я узнал, что проверка MANDT/CLIENT не требуется в Open SQL. Я обновил вопрос. Верен ли текст, который я добавил к вопросу (после обновления...)? - person guettli; 25.10.2018
comment
@guettli Верно! (жаль, что не видел этого :)) - person Sandra Rossi; 25.10.2018
comment
Подтверждаю свое первое ощущение по поводу строгого режима. Я предпочитаю добавить новый ответ, чтобы сделать его более понятным. - person Sandra Rossi; 25.10.2018
comment
И просто для ясности: IN с кортежами — это вполне допустимый SQL. Однако OpenSQL является лишь подмножеством SQL и не поддерживает многозначные кортежи в предложении IN. - person Florian; 26.10.2018