顾问给我发了这个代码示例,这是他希望得到的东西
SELECT m1~vbeln_im m1~vbelp_im m1~mblnr smbln
INTO CORRESPONDING FIELDS OF TABLE lt_mseg
FROM mseg AS m1
INNER JOIN mseg AS m2 ON m1~mblnr = m2~smbln
AND m1~mjahr = m2~sjahr
AND m1~zeile = m2~smblp
FOR ALL ENTRIES IN lt_vbfa
WHERE
AND m2~bwart = '102'
AND 0 = ( select SUM( ( CASE
when SHKZG = 'S' THEN 1
when SHKZG = 'H' THEN -1
else 0
END ) *MENGE ) MENGE
into lt_mseg-summ
from mseg
where
VBELN_IM = m1~vbeln_im
and VBELP_IM = m1~vbelp_im
).
问题是我不明白这在当前语法中应该如何工作。我考虑派生内部选择并将其用作主选择的条件,但是有没有正确的方法来编写这种嵌套结构?
据我所知,如果嵌套语句 = 0,则执行主查询。这里的问题是嵌套语句中的情况。在ABAP中甚至可能吗?在我看来,此检查可以在主SQL查询之外使用。
欢迎任何建议。
的逻辑是原生/开放SQL的一部分,有一些你需要注意的缺点。
- 您显示的语句必须放在EXEC SQL和ENDEXEC之间。
- 逻辑取决于平台。
- 在EXEC和ENDEXEC之间没有执行语法检查
- 此操作的执行会绕过数据库缓冲过程,因此速度较慢
对我来说,我会研究一种更好的方法来捕获在开放/本机SQL之外表现更好的数据。
如果你想继续这种类型的逻辑,下面是几个应该有帮助的链接。有一个使用带有 case 语句的嵌套选择的示例选择。测试程序示例逻辑
这可能是您需要的,它至少从 ABAP 750 开始工作。
SELECT vbeln UP TO 100 ROWS
FROM vbfa
INTO TABLE @DATA(lt_vbfa).
DATA(rt_vbeln) = VALUE range_vbeln_va_tab( FOR GROUPS val OF <line> IN lt_vbfa GROUP BY ( low = <line>-vbeln ) WITHOUT MEMBERS ( sign = 'I' option = 'EQ' low = val-low ) ).
SELECT m1~vbeln_im, m1~vbelp_im, m1~mblnr, m2~smbln
INTO TABLE @DATA(lt_mseg)
FROM mseg AS m1
JOIN mseg AS m2
ON m1~mblnr = m2~smbln
AND m1~mjahr = m2~sjahr
AND m1~zeile = m2~smblp
WHERE m2~bwart = '102'
AND m1~vbeln_im IN ( SELECT vbelv FROM vbfa WHERE vbelv IN @rt_vbeln )
GROUP BY m1~vbeln_im, m1~vbelp_im, m1~mblnr, m2~smbln
HAVING SUM( CASE m1~shkzg WHEN 'H' THEN 1 WHEN 'S' THEN -1 ELSE 0 END * m1~menge ) = 0.
是的,在一个 SELECT 中不可能聚合和FOR ALL ENTRIES
,但您可以使用范围和子查询欺骗系统。此外,您不需要三个联接来汇总反向文档,您的 SUM 子查询在这里是多余的。
如果您不仅需要按交货编号选择文件,还需要按位置选择文件,这肯定会更加复杂。