Переписывание запроса с объединением таблицы, содержащего предложение GROUP BY

#oracle #peoplesoft

#Oracle #peoplesoft

Вопрос:

Возможно ли переписать следующий запрос

 SELECT      CT.GROUP, CT.EMP_ID, HT.EFF_DT
FROM        CURR_TABLE CT
JOIN        (SELECT     GROUP, EMP_ID, MAX(EFF_DT) AS EFF_DT
            FROM        HIST_TABLE
            WHERE       STAT = 'A' 
            GROUP BY    GROUP, EMP_ID) HT ON CT.GROUP = HT.GROUP AND 
            CT.EMPID = HT.EMP_ID
WHERE       CT.GROUP = :1
AND         CT.EMP_ID = :2
  

способом, похожим на CROSS JOIN стиль?

 SELECT table1.column1, table2.column2...
FROM  table1, table2 [, table3 ]
  

Причина в том, что я хочу создать такой запрос в Peoplesoft, и вышеупомянутое может быть достигнуто только путем создания отдельного представления для выбора с предложением group by. Я хочу сделать это только в одном запросе без создания дополнительных представлений.

Ответ №1:

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

 SELECT
    CT.GROUP,
    CT.EMP_ID,
    MAX(HT.EFF_DT) AS EFF_DT
FROM CURR_TABLE CT
LEFT JOIN HIST_TABLE HT
    ON CT.GROUP = HT.GROUP AND
       CT.EMPID = HT.EMP_ID AND
       HT.STAT = 'A'
WHERE
    CT.GROUP = :1 AND
    CT.EMP_ID = :2
GROUP BY
    CT.GROUP,
    CT.EMP_ID;
  

Обратите внимание, что GROUP это зарезервированное ключевое слово SQL, и вам, возможно, придется заключить его в двойные кавычки, чтобы этот запрос (или тот, что в вашем вопросе) работал в Oracle.

Комментарии:

1. Почему вы используете LEFT JOIN вместо JOIN ?

2. Потому что возможно, что данная GROUP/EMP_ID комбинация не имеет записей where STAT = 'A' . Левое объединение позволяет избежать удаления некоторых записей из вашего результирующего набора. Если вас это не беспокоит, то вы можете использовать inner join и переместить проверку в предложении STAT на WHERE .