联接具有max(date)的表,其中date小于另一个表的end_date值

时间:2019-05-03 16:28:48

标签: sql oracle join

我在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

编辑: Link to 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

0 个答案:

没有答案