首页 文章

根据ABAP Open SQL中的列值,仅从数据库表中选择一行

提问于
浏览
1

我正在寻找一个解决方案,我想从DB表中只选择一行,具体取决于像标志一样的列 .

示例DB表如下所示:

C1 | C2 | C3
-----------------
A1 | N1 | 

A1 | N2 | X

A1 | N3 |

A2 | N21 | X

A2 | N22 |

其中C1和C2是关键字段 . 在这个例子中,A1有3个条目,其中一个有一个标志为真('X') .

我想选择带有flag ='X'的条目或C2值的最小值 .

这在ABAP Open SQL中是否可行?我尝试使用case语句,但没有给我所需的结果 .

EDIT 1:

在上面的例子中:结果将是

A1 | N2

A2 | N21

当标志为假或空时,则:

A1 | N1

A2 | N21

1 回答

  • 5

    当然有可能 . 实际上它与标准SQL的区别不应太大 .

    SELECT *
      FROM <your_table>
      WHERE
        c3 = 'X'
        OR
        NOT EXISTS ( SELECT * FROM <your_table> WHERE c3 = 'X' ) 
          AND ( c2 = ( SELECT MIN( c2 ) FROM <your_table> ) )
      INTO TABLE @DATA(lt_your_table).
    

    以下是使用表 T000 完成的示例报告 .

    REPORT yyy.
    
    SELECT *
      FROM t000
      WHERE
        mandt = '101'
        OR
        mandt = ( SELECT MIN( mandt ) FROM t000 )
          AND NOT EXISTS ( SELECT * FROM t000 WHERE mandt = '101' )
      INTO TABLE @DATA(lt_your_table).
    
    LOOP AT lt_your_table ASSIGNING FIELD-SYMBOL(<fs_your_table>).
      WRITE <fs_your_table>-mandt.
    ENDLOOP.
    

    编辑:您的评论后,查询可能如下所示 .

    SELECT mandt, cccoractiv
      FROM t000
      WHERE
        cccopylock = 'X'
    UNION
    SELECT mandt, MIN( cccoractiv ) AS cccoractiv
      FROM t000
      WHERE
        cccopylock <> 'X'
          AND NOT EXISTS ( SELECT * FROM t000 WHERE cccopylock = 'X' )
        GROUP BY mandt
    INTO TABLE @DATA(lt_your_table).
    

相关问题