我想构建一个 OpenSQL 查询,以仅返回所有 .objnr
的最大stat
值:
SELECT O.OBJNR
FROM JCDS AS O
WHERE O.OBJNR = 'Obj12345'
AND STAT = ( SELECT MAX(STAT)
FROM JCDS AS I
WHERE I.OBJNR = O.OBJNR )
但是,如果我尝试使用联接,而不是直接提供objnr
,则会收到一条错误消息:
SELECT O.OBJNR, O.STAT
FROM JCDS AS O
INNER JOIN AFVC
ON AFVB.OBJNR = O.OBJNR
WHERE "AUFPL" = 'Aufpl12345'
AND O.STAT = ( SELECT MAX(STAT)
FROM JCDS AS I
WHERE I.OBJNR = O.OBJNR )
错误消息毫无意义;"SQL 错误">
>EDIT 2023:原始问题被标记为 SQL HANA(与 OpenSQL 一起(,并在别名(不是 OpenSQL(之后包含.
,因此答案中存在混乱。说"工作"的代码也有错误。作者后来修改了这个问题,用~
替换了所有.
,所以这个问题肯定是关于OpenSQL的。Hana可能被误认为是S4HANA(包含表JCDS
和AFVC
(。根据OP的答案(唯一的问题是AFVB
而不是AFVC
的错别字(,我编辑了问题,使原始问题保持与原始答案一致,并添加了以下部分以符合OP的问题和答案。我希望这个编辑能带来清晰度,并且不会背叛OP想要表达的内容。我检查了下面的代码"这工作",使用ABAP/OpenSQL 7.52(它肯定不是OP版本(和S/4HANA 1709。
我想在 S/4HANA 系统中构建一个 OpenSQL 查询,以仅返回所有objnr
的最大stat
值。
这有效:
SELECT O~OBJNR
FROM JCDS AS O
WHERE O~OBJNR = 'Obj12345'
AND STAT = ( SELECT MAX( STAT )
FROM JCDS AS I
WHERE I~OBJNR = O~OBJNR )
INTO TABLE @DATA(result).
但是,如果我尝试使用联接,而不是直接提供objnr
,则会收到一条错误消息:
SELECT O~OBJNR, O~STAT
FROM JCDS AS O
INNER JOIN AFVC
ON AFVB~OBJNR = O~OBJNR
WHERE AUFPL = 'Aufpl12345'
AND O~STAT = ( SELECT MAX( STAT )
FROM JCDS AS I
WHERE I~OBJNR = O~OBJNR )
INTO TABLE @DATA(result).
错误消息"AFVB" is unknown in the current FROM clause (obscured by an alias name or unknown in this position)
,光标指向AFVB
。
> 在 EDIT 2023 之后回答问题(关于 OpenSQL/ABAP SQL 的问题(,简而言之,这是一个错字:而不是AFVB~OBJNR
,它应该是AFVC~OBJNR
.此代码在 S/4HANA 1709 ABAP 7.52 中编译:
SELECT O~OBJNR, O~STAT
FROM JCDS AS O
INNER JOIN AFVC
ON afvC~OBJNR = O~OBJNR
WHERE AUFPL = '0123456789'
AND O~STAT = ( SELECT MAX( STAT )
FROM JCDS AS I
WHERE I~OBJNR = O~OBJNR )
INTO TABLE @DATA(result).
铌:
- 空格在
MAX( STAT )
中是必需
的 INTO ...
是强制性
的"AUFPL" = '0123456789'
中的双引号在 ABAP SQL 中无效(双引号用于在 ABAP 中定义注释(
您可以通过按对象编号分组来简化查询:
SELECT O.OBJNR, MAX(O.STAT)
FROM JCDS AS O
GROUP BY O.OBJNR
根据需要从联接表中显示哪些列,可以通过以下方式扩展组:
SELECT O.OBJNR, A.SOMECOL, MAX(O.STAT)
FROM JCDS AS O
INNER JOIN AFVC AS A
ON AFVB.OBJNR = O.OBJNR
GROUP BY O.OBJNR, A.SOMECOL
或使用子查询:
SELECT MAXSTAT.OBJNR, MAXSTAT.STAT, A.SOMECOL
FROM (
SELECT O.OBJNR, MAX(O.STAT) STAT
FROM JCDS AS O
GROUP BY O.OBJNR ) MAXSTAT
INNER JOIN AFVC AS A
ON AFVB.OBJNR = MAXSTAT.OBJNR
您是否正在寻找每objnr
stat
最高的记录?您可以为此使用窗口函数:
select *
from
(
select
jcds.*,
max(stat) over (partition by objnr) as max_stat
from jcds
) data
where stat = max_stat;
如果我没有错误地键入表名,则子选择与 JOIN 完美配合
:SELECT O~OBJNR, O~STAT
FROM JCDS AS O
INNER JOIN AFVC
-- ON afvB~OBJNR = O~OBJNR
-- |
ON afvC~OBJNR = O~OBJNR
WHERE AUFPL = '0123456789'
AND O~STAT = ( SELECT MAX(STAT)
FROM JCDS AS I
WHERE I~OBJNR = O~OBJNR )