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