我正在尝试从子表中匹配变量的表中检索行。但是,似乎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 ).
但很明显,这个select将我的局部变量视为字段名称,它给我错误“未知列名”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并完成它。
答案 0 :(得分:2)
以下程序可能会引导您使用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读取字段时才有效。如果您这样做,则必须在循环搜索结果时将其与其他选项一起收集。
答案 1 :(得分:1)
对于那些在2020年发现此问题的帅哥,我报告自ABAP 7.50起支持此构造。无需任何解决方法:
product_id
这将选择在某个销售组织中下了5个销售订单的所有客户。
答案 2 :(得分:0)
在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。
希望它有所帮助。