Оператор 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')
Другие вопросы по тегам