使用 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
的主键由 MANDT
和 VBELN
列组成(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 语句不正确的主要内容,如果未能解决你的问题,请参考以下文章