我正在尝试从子查询与变量匹配的表中检索行。但是,似乎WHERE子句只允许我将所选表的字段与常量,变量或子查询进行比较。
我希望写这样的东西:
DATA(lv_expected_lines) = 5.
SELECT partner contract_account
INTO TABLE lt_bp_ca
FROM table1 AS tab1
WHERE lv_expected_lines = (
SELECT COUNT(*)
FROM table2
WHERE partner = tab1~partner
AND contract_account = tab1~contract_account ).
但是很明显,此选择将我的局部变量视为字段名,并且它给我错误“未知列名” lv_expected_lines“,直到运行时,您无法指定字段列表。”
但是在标准SQL中,这完全有可能:
SELECT PARTNER, CONTRACT_ACCOUNT
FROM TABLE1 AS TAB1
WHERE 5 = (
SELECT COUNT(*)
FROM TABLE2
WHERE PARTNER = TAB1.PARTNER
AND CONTRACT_ACCOUNT = TAB1.CONTRACT_ACCOUNT );
所以我该如何在RSQL / Open SQL中复制此逻辑?
如果没有办法,我可能只会编写本机SQL并完成它。
下面的程序可能会带您进入Open SQL解决方案。它使用SAP演示表来确定在特定数量的航班上使用的飞机类型。
REPORT zgertest_sub_query.
DATA: lt_planetypes TYPE STANDARD TABLE OF s_planetpp.
PARAMETERS: p_numf TYPE i DEFAULT 62.
START-OF-SELECTION.
SELECT planetype
INTO TABLE lt_planetypes
FROM sflight
GROUP BY planetype
HAVING COUNT( * ) EQ p_numf.
LOOP AT lt_planetypes INTO DATA(planetype).
WRITE: / planetype.
ENDLOOP.
仅当您不需要从TAB1中读取字段时,它才有效。如果您这样做,则必须在循环搜索结果时将它们与其他选择项一起收集。
在ABAP中,无法像在NATIVE SQL中那样执行查询。我建议不要使用NATIVE SQL,而应尝试使用SELECT / ENDSELECT语句。
DATA: ls_table1 type table1,
lt_table1 type table of table1,
lv_count type i.
SELECT PARTNER, CONTRACT_ACCOUNT
INTO ls_table1
FROM TABLE1.
SELECT COUNT(*)
INTO lv_count
FROM TABLE2
WHERE PARTNER = TAB1.PARTNER
AND CONTRACT_ACCOUNT = TAB1.CONTRACT_ACCOUNT.
CHECK lv_count EQ 5.
APPEND ls_table1 TO lt_table1.
ENDSELECT
这里仅在选择table2时将count等于5的行附加到ls_table1。
希望有帮助。
[对于那些在2020年发现这个问题的家伙,我报告自ABAP 7.50起支持这种构造。无需任何解决方法:
SELECT kunnr, vkorg
FROM vbak AS v
WHERE 5 = ( SELECT COUNT(*)
FROM vbap
WHERE kunnr = v~kunnr
AND vkorg = v~vkorg )
INTO TABLE @DATA(customers).
此选择在某个销售组织中下了5个销售订单的所有客户。