Abap 在子查询中选择多个字段

Abap 在子查询中选择多个字段,abap,opensql,Abap,Opensql,此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

此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有效。这在ABAP的开放式SQL中无效吗

如果不允许使用元组语法,我该怎么办


不需要在OpenSQL中检查MANDT,所以这只是一个示例查询

不能将中用于多列。试着这样做:

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)

为了完成Pelin的回答,根据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 ).

在ABAP中,如果使用,则会出现语法错误。在表别名之后。相反,您必须使用~。请注意,如果我是对的,请确保:如果您使用select 1,那么它只能在OpenSQL的严格模式下工作,因此您应该在变量前面使用@。在非严格模式下,您可以使用WHERE exists select*only~ not~。@SandraRossi我了解到,在opensql中不需要检查MANDT/CLIENT。我更新了问题。是我在更新后添加到问题中的文本。。。对吗?@guettli对!很抱歉没有看到:亲爱的桑德拉·罗西。非常感谢你的帮助。有没有办法送你一束花?你在StackOverlow上的帮助无价。谢谢,不客气。我更喜欢格式良好的StackOverflow问题-继续!