如何将 SUBSELECT 与 JOIN 一起使用?



我想构建一个 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(包含表JCDSAFVC(。根据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

您是否正在寻找每objnrstat最高的记录?您可以为此使用窗口函数:

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 )

相关内容

  • 没有找到相关文章

最新更新