Оператор SQL на таблице фильтров / ABAP
Я работаю над программой ABAP. У меня есть таблица фильтров с парами ZFIELD и ZVALUE (например, "страна"+"DE", "дата"+"Q1.2014"). Мне нужно запросить эту таблицу и найти CID пар, которые соответствуют критериям моего фильтра. Чтобы проиллюстрировать это на примере:
Таблица ZFILTER (CID, FID, ZFIELD, ZVALUE):
1, 1, "country", "DE"
1, 2, "country", "SE"
1, 3, "date", "Q1.2014"
Мои критерии фильтрации из внешнего интерфейса:
country=DE, date=Q1.2014
Теперь я хочу найти все идентификаторы CID, для которых критерии фильтра совпадают, поэтому в этом случае страна соответствует DE, а дата - Q1.2014, а ожидаемое возвращаемое значение - CID=1.
Я пробовал следующий запрос:
SELECT DISTINCT CID
FROM ZFILTER INTO TABLE LT_COMFILT
WHERE ( ZFIELD = 'country' AND ZVALUE = 'DE' )
AND
( ZFIELD = 'date' AND ZVALUE = 'Q1.2014' )
однако, очевидно, что это не дает мне результата из-за AND между утверждениями. Я предполагаю, что мне придется создать какой-то подзапрос, но я борюсь с этим в ABAP, так как он превосходит мои знания Open SQL.
Есть ли лучший способ решить эту задачу, или у кого-то есть сведения о том, как ее решить (возможно, с помощью синтаксически правильного примера подзапроса в Open SQL)? Надеюсь, понятно, чего я хочу достичь.
Заранее спасибо!
3 ответа
Если я правильно понимаю вашу проблему, это именно мотивация существования for all entries
идиома в ABAP Open SQL:
data: ls_filter type zfilter,
lt_filter type table of zfilter,
lt_result type table of zfilter.
* Fill filter table
ls_filter-zfield = `country`.
ls_filter-zvalue = `DE`.
append ls_filter to lt_filter.
ls_filter-zfield = `date`.
ls_filter-zvalue = `Q1.2014`.
append ls_filter to lt_filter.
* Get result: Important: Don't execute if lt_filter is initial!
if lt_filter is not initial.
select * from zfilter into table lt_result
for all entries in lt_filter
where zfield = lt_filter-zfield
and zvalue = lt_filter-zvalue.
endif.
Почему вы не можете справиться с этим на уровне ABAP, а не на уровне БД? Сколько записей ожидается в таблице ZFILTER? Если это не так уж и сложно, проще обработать циклы abap, сначала собрав все данные в таблице и написав свою логику.
Вы можете сделать это с таким подзапросом SQL
SELECT cid, zfield, zvalue AS country
FROM zfilter
INTO TABLE @DATA(lt_filter)
WHERE cid = ANY ( SELECT cid FROM zfilter WHERE zfield = 'country' AND zvalue = 'DE' )
AND zfield = 'date' AND zvalue = 'Q1.2014').
Если у него несколько CID со страной DE и этой датой, то будут извлечены все они.
Я думаю, что это даст вам то, что вы после.
SELECT DISTINCT CID
FROM ZFILTER INTO TABLE LT_COMFILT
WHERE CID IN (SELECT CID FROM ZFILTER WHERE ZFIELD = 'country' AND ZVALUE = 'DE')
AND CID IN (SELECT CID FROM ZFILTER WHERE ZFIELD = 'date' AND ZVALUE = 'Q1.2014')