ABAP程序的嵌套sql-query

时间:2016-03-22 07:52:18

标签: sql abap

顾问发给我这个代码示例,就像他期望得到的东西一样。

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查询之外使用。但我对ABAP很新手,所以我给其他可能的解释留下了空间。

2 个答案:

答案 0 :(得分:2)

您获得的逻辑是Native / Open SQL的一部分,并且存在一些您需要注意的缺点。

  1. 您要显示的语句必须放在EXEC SQL和ENDEXEC之间。
  2. 逻辑依赖于平台。
  3. EXEC和ENDEXEC之间没有执行语法检查
  4. 执行此操作会绕过数据库缓冲过程,因此其速度较慢
  5. 对我来说,我会研究一种更好的方法来捕获在开放/本机sql之外表现更好的数据。

    如果你想继续使用这种类型的逻辑,下面是一些应该有用的链接。有一个示例选择使用带有case语句的嵌套选择。 Test Program Example Logic

答案 1 :(得分:0)

这可能是您所需要的,至少从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子查询是多余的。

如果您不仅需要按交货号来选择文件,还需要按位置来选择文件,那肯定会更加复杂。