Как я могу использовать SUBSELECT с JOIN?
Я хочу построить запрос OpenSQL, чтобы вернуть только максимум stat
ценность для всех objnr
,
Это работает:
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"
4 ответа
Подраздел безупречно работает с 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" = 'Aufpl12345'
AND O.STAT = ( SELECT MAX(STAT)
FROM JCDS AS I
WHERE I.OBJNR = O.OBJNR )
Чтобы ответить на вопрос после 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
Вы ищете рекорд с самым высоким stat
в objnr
? Вы можете использовать оконную функцию для этого:
select *
from
(
select
jcds.*,
max(stat) over (partition by objnr) as max_stat
from jcds
) data
where stat = max_stat;