首页 文章

过滤器表/ ABAP上的SQL语句

提问于
浏览
0

我正在研究ABAP计划 . 我有一个带有ZFIELD和ZVALUE对的过滤表(例如“country”“DE”,“date”“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,所以在这种情况下,country是DE的匹配,date是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 回答

  • 1

    如果我理解你的问题,那正是ABAP Open SQL中存在 for all entries 成语的动机:

    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.
    
  • 0

    为什么不能在ABAP层而不是DB层中处理这个问题? ZFILTER表中预计有多少条记录?如果它不太苛刻,通过首先获取表中的所有数据并编写逻辑,更容易处理abap via循环 .

  • 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')
    

相关问题