Открытый SQL - переменная WHERE = (подзапрос)

Я пытаюсь получить строки из таблицы, где подзапрос соответствует переменной. Однако кажется, что предложение 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 и покончу с этим.

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. Если вы это сделаете, вам придется собирать их с другими вариантами выбора, пока вы будете повторять результаты.

Для тех парней, кто нашел этот вопрос в 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 заказов на продажу в какой-либо сбытовой организации.

В 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

Здесь вы добавляете к ls_table1 только те строки, в которых count равен 5 при выборе table2.

Надеюсь, поможет.

Другие вопросы по тегам