#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
комбинация не имеет записей whereSTAT = 'A'
. Левое объединение позволяет избежать удаления некоторых записей из вашего результирующего набора. Если вас это не беспокоит, то вы можете использовать inner join и переместить проверку в предложенииSTAT
наWHERE
.