У меня Oracle sql запрос в ansi-89.Я пытался переписать его в код с помощью JOINS.
SELECT * FROM (SELECT *
FROM A
JOIN B ON A.b_id = B.id
JOIN (SELECT class_id, group_id, name, eff_date,
max(eff_date) OVER(PARTITION BY class_id, group_id) max_date FROM C) T
on T.class_id= A.class_id AND T.group_id= A.group_id)
WHERE eff_date = max_date;
В этом случае я получаю записи с таблицей max(eff_date)
в C
, но мне нужно ограничить значение C.eff_date
значением B.end_date
изB
стол.
Я хотел присоединиться ко всем записям из C на C.eff_date < B.end_date
, и они будут в подзапросе, а затем таким же образом выбрать max (дату) с оператором group by или OVER (...).Разве это не будет эффективным?У меня есть еще 3 таблицы, такие как таблица C для JOIN с тем же условием на значение даты не больше, чем B.end_date
.Как я могу сделать это правильно?
SELECT * FROM (SELECT A.*, B.end_date, C.name, C.eff_Date,
max(C.eff_date) OVER (PARTITION BY C.class_id, C.group_id) max_date
FROM A
JOIN B ON A.b_id = B.id
JOIN C on C.class_id = A.class_id AND C.group_id= A.group_id AND C.eff_date <= B.end_date) T
WHERE T.eff_date= T.max_date
РЕДАКТИРОВАТЬ: Ссылка на sqlfiddle
Table A
ID B_ID CLASS_ID GROUP_ID
1 1 AA BB
2 2 AA CC
Table B
ID SOME_VAL END_DATE
1 value1 03-MAY-19
2 value2 05-MAY-19
Table C
CLASS_ID GROUP_ID NAME EFF_DATE
AA BB name1 01-MAY-19
AA BB name2 02-MAY-19
AA BB name3 03-MAY-19
AA BB name4 04-MAY-19
AA CC name1 01-MAY-19
AA CC name2 02-MAY-19
AA CC name3 03-MAY-19
AA CC name4 04-MAY-19
После объединения я хочу получить:
A.ID A.CLASS_ID A.GROUP_ID B.END_DATE NAME EFF_DATE
1 AA BB 03-MAY-19 name3 03-MAY-19
2 AA CC 05-MAY-19 name4 04-MAY-19