我在ansi-89中有Oracle sql查询。我试图用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.eff_date < B.end_date
上从C连接所有记录,这些记录将在子查询中,然后以相同的方式用group by或OVER(...)语句选择max(date)。会不会有效?
我还有3个表,例如C表,要在日期值不大于B.end_date
的情况下加入JOIN。我该如何以正确的方式做到这一点?
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
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