【问题标题】:Incorrect SQL statement using FOR ALL ENTRIES and NOT EXISTS使用 FOR ALL ENTRIES 和 NOT EXISTS 的 SQL 语句不正确
【发布时间】:2021-12-24 16:48:17
【问题描述】:

我正在尝试选择表VBRK,目标是从VBRK 中选择所有数据,而不是NETWR 列为0 的那些数据。代码如下:

 SELECT DISTINCT * FROM vbrk INTO TABLE gt_vbrk
      FOR ALL ENTRIES IN gt_vbfa_inv
      WHERE vbeln = gt_vbfa_inv-vbeln
        AND NOT EXISTS (SELECT DISTINCT * FROM vbrk 
                        INTO TABLE gt_vbrk
                        FOR ALL ENTRIES IN gt_vbfa_inv
                        WHERE netwr = 0). //Here I get an error

所以我收到一个错误,即执行 NOT EXISTS 在语法上不正确。有人可以告诉我如何修复上面的代码或选择不会选择NETWR = 0 的数据吗?

提前谢谢大家!

【问题讨论】:

    标签: abap sap-erp


    【解决方案1】:

    只需将netwr添加到WHERE条件,NE表示不等于:

     SELECT DISTINCT * 
            FROM vbrk 
            INTO TABLE gt_vbrk
            FOR ALL ENTRIES IN gt_vbfa_inv
            WHERE vbeln EQ gt_vbfa_inv-vbeln
              AND netwr NE 0.
    

    【讨论】:

      【解决方案2】:

      供您参考,您的原始 SQL 查询中存在一些误解:

      1. 关于FOR ALL ENTRIES,它只能在主 SELECT 中使用,不能在嵌套 SELECT 中使用(就像你一样)。
      2. 您也无权在嵌套 SELECT 中使用 INTO,它只能在主 SELECT 中使用。
      3. 使用EXISTS时,必须在EXISTS后指明主查询和SELECT之间的一种连接信息。如果您需要对同一个表执行此操作,则需要分配一个表别名,以便您可以指示列的来源。
      4. 在 SAP ERP 软件/基于 ABAP 的系统中,所有数据库表都有一个主键,因此如果您获取主键的所有列(如您所做的那样),则不需要使用 DISTINCT。注意:VBRK 的主键由 MANDT 和 VBELN 列组成(ABAP 中通常不需要第一个)。
      5. 从表 (SELECT * FROM ...) 中选择所有列通常是不好的做法,您应该只指明真正需要的列。
      6. 不要忘记 ABAP 中的空格,它们是必需的。

      József 的答案是正确的。仅供参考,以下 SQL 语句给出了相同的结果,它显示了与您可以做的不同之处:

      TYPES: BEGIN OF ty_vbfa_inv,
               vbeln TYPE vbrk-vbeln,
             END OF ty_vbfa_inv.
      DATA: gt_vbrk     TYPE TABLE OF vbrk,
            gt_vbfa_inv TYPE TABLE OF ty_vbfa_inv..
      
      SELECT * FROM vbrk INTO TABLE gt_vbrk
           FOR ALL ENTRIES IN gt_vbfa_inv
           WHERE vbeln = gt_vbfa_inv-vbeln
             AND NOT EXISTS ( SELECT * FROM vbrk              "<====== space needed
                              AS vbrk2                        "<====== needed alias
      *                       INTO TABLE gt_vbrk              "<====== forbidden
      *                       FOR ALL ENTRIES IN gt_vbfa_inv  "<====== forbidden
                             WHERE netwr = 0
                               AND vbrk2~vbeln = vbrk~vbeln )."<====== join needed
      

      【讨论】:

        猜你喜欢
        • 2012-01-19
        • 2013-10-30
        • 1970-01-01
        • 2011-02-03
        • 2015-06-17
        • 2014-07-23
        • 2010-10-15
        • 2015-02-17
        • 2018-01-28
        相关资源
        最近更新 更多