Как я могу использовать SUBSELECT с JOIN? - PullRequest
0 голосов
/ 02 октября 2018

Я хочу создать запрос 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»

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Вы ищете рекорд с самым высоким stat за objnr?Вы можете использовать оконную функцию для этого:

select *
from
(
  select
    jcds.*,
    max(stat) over (partition by objnr) as max_stat
  from jcds
) data
where stat = max_stat;
0 голосов
/ 03 октября 2018

Подвыбор безупречно работает с 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 )
0 голосов
/ 02 октября 2018

Вы можете упростить свой запрос следующим образом, сгруппировав по номеру объекта:

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
...