首页 > 解决方案 > 使用 max(date) 连接表,其中 date 小于另一个表 end_date 值

问题描述

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

我想加入来自 C 的所有记录,C.eff_date < B.end_date这些记录将在子查询中,然后以相同的方式使用 group by 或 OVER(...) 语句选择 max(date)。不会有效吗?我还有 3 个表,例如 C 表,以在日期值不大于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

标签: sqloraclejoin

解决方案


推荐阅读