使用 FOR ALL ENTRIES 和 NOT EXISTS 的 SQL 语句不正确

Incorrect SQL statement using FOR ALL ENTRIES and NOT EXISTS

我正在尝试对 table VBRK 进行 select 处理,目的是 select 来自 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 在语法上是不正确的。有人能告诉我如何修复上面的代码或做一个 selection,其中 NETWR = 0 的数据不会被 selected 吗?

提前谢谢大家!

只要在WHERE条件中加上netwr即可,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.

供参考,您最初的 SQL 查询中几乎没有误解:

  1. 关于FOR ALL ENTRIES,只能在主SELECT中使用,不能在嵌套SELECT中使用(如你所用)
  2. 您也无权在嵌套 SELECT 中使用 INTO,它只能在主 SELECT.
  3. 中使用
  4. 当你使用EXISTS时,你必须在主查询和EXISTS后的SELECT之间指明一种连接信息。如果您需要使用相同的 table 执行此操作,将分配一个 table 别名,以便您可以指示列的来源。
  5. 在 SAP ERP software/ABAP-based 系统中,所有数据库 table 都有一个主键,因此如果您获得了主键的所有列(就像您所做的那样),则不需要使用 DISTINCT .注意:VBRK 的主键由 MANDTVBELN 列组成(ABAP 通常不需要第一个)。
  6. select table (SELECT * FROM ...) 中的所有列通常是不好的做法,您应该只指明您真正需要的列。
  7. 不要忘记 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