打开SQL - WHERE变量=(子查询)

时间:2015-02-19 08:37:17

标签: abap opensql

我正在尝试从子表中匹配变量的表中检索行。但是,似乎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并完成它。

3 个答案:

答案 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。

希望它有所帮助。