OpenSQL中的WHERE变量=(子查询)

问题描述 投票:4回答:3

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

subquery sap abap opensql
3个回答
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中读取字段时,它才有效。如果您这样做,则必须在循环搜索结果时将它们与其他选择项一起收集。


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。

希望有帮助。


0
投票

[对于那些在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个销售订单的所有客户。

© www.soinside.com 2019 - 2024. All rights reserved.