根据ABAP OPEN SQL中的列值,从DB表中仅选择一行



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

样本DB表看起来像这样:

C1 | C2 | C3
-----------------
A1 | N1 | 
A1 | N2 | X
A1 | N3 |
A2 | N21 | X
A2 | N22 |

其中C1和C2是关键字段。在此示例中,A1有3个条目,其中一个具有标志为true('x')。

我想选择具有标志='x'的条目或C2值的最小值。

在ABAP OPEN SQL中可能可以吗?我尝试使用案例语句,但没有给我带来所需的结果。

编辑1:

在上面的示例中:结果将为

a1 |N2

a2 |N21

,当标志为false或空时,则:

a1 |N1

a2 |N21

当然是可能的。实际上,它应该与标准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).

相关内容

  • 没有找到相关文章

最新更新