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

Posted

技术标签:

【中文标题】使用 FOR ALL ENTRIES 和 NOT EXISTS 的 SQL 语句不正确【英文标题】:Incorrect SQL statement using FOR ALL ENTRIES and NOT EXISTS 【发布时间】: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 的数据吗?

提前谢谢大家!

【问题讨论】:

【参考方案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 查询中存在一些误解:

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

【讨论】:

以上是关于使用 FOR ALL ENTRIES 和 NOT EXISTS 的 SQL 语句不正确的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别