Открытый 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.
Надеюсь, поможет.