Select 数据库中只有一行 Table 取决于 ABAP Open 中的列值 SQL
Select only one row from a DB Table depending on a column value in ABAP Open SQL
我正在寻找一种解决方案,我希望 select 数据库中只有一行 Table 取决于像标志一样的列。
示例数据库 table 如下所示:
C1 | C2 | C3
-----------------
A1 | N1 |
A1 | N2 | X
A1 | N3 |
A2 | N21 | X
A2 | N22 |
其中 C1 和 C2 是关键字段。在这个例子中,A1 有 3 个条目,其中一个有一个标志 true ('X').
我想 select 带有标志 = 'X' 的条目或 C2 值的最小值。
这在 ABAP Open SQL 中可行吗?我尝试使用 case 语句,但没有给我所需的结果。
编辑 1:
在上面的例子中:结果将是
A1 | N2
A2 | N21
当标志为假或空时:
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).
这是使用 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).
我正在寻找一种解决方案,我希望 select 数据库中只有一行 Table 取决于像标志一样的列。
示例数据库 table 如下所示:
C1 | C2 | C3
-----------------
A1 | N1 |
A1 | N2 | X
A1 | N3 |
A2 | N21 | X
A2 | N22 |
其中 C1 和 C2 是关键字段。在这个例子中,A1 有 3 个条目,其中一个有一个标志 true ('X').
我想 select 带有标志 = 'X' 的条目或 C2 值的最小值。
这在 ABAP Open SQL 中可行吗?我尝试使用 case 语句,但没有给我所需的结果。
编辑 1:
在上面的例子中:结果将是
A1 | N2
A2 | N21
当标志为假或空时:
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).
这是使用 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).