Как я могу использовать 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;
Другие вопросы по тегам