1

我正在开发一个 ABAP 程序,并且我有一个过滤表 ZFILTER(CID、FID、ZFIELD、ZVALUE)。“国家”+“德国”、“日期”+“Q1.2014”等内容ZFIELD和配对。ZVALUE用一个例子来说明这一点:

1, 1, "country", "DE"
1, 2, "country", "SE"
1, 3, "date", "Q1.2014"

我需要查询该表并找到与我的过滤条件相对应的对的 CID。我的前端过滤条件:

country=DE, date=Q1.2014

我现在想查找国家为“DE”且日期为“Q1.2014”且 CID 的预期返回值为 1 的所有 CID。

我尝试了以下查询:

 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 中的子查询示例)?

4

3 回答 3

1

如果我正确理解您的问题,这正是for all entriesABAP 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.
于 2014-10-29T14:54:27.257 回答
0

我认为这会给你你所追求的。

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')
于 2014-10-29T14:33:21.827 回答
0

您可以使用此类 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').

如果它有多个带有 DE 国家和此日期的 CID,则将获取所有这些 CID。

于 2020-03-23T13:11:52.247 回答