SQL在多个表中选择,每个连接表中的最大日期为
问题描述:
我有一个Oracle 11 SQL查询,我从4个表中抽取所有由ID连接的数据。加入第一个表的每个表都有一个ACTIVE_IND值,该值必须是'Y'和生效日期(EFF_DATE),并且我需要每个记录的生效日期最长。SQL在多个表中选择,每个连接表中的最大日期为
我有一个查询,在这里工作,但想知道是否有一个更优化/有效/有效的方式写它,因为它似乎有点慢。我目前使用这样看起来是什么:
SELECT DISTINCT A.TABLE1_ID,
A.TABLE1_COL1,
B.TABLE2_COL2,
C.TABLE3_COL3,
D.TABLE4_COL4
FROM TABLE1 A,
TABLE2 B,
TABLE3 C,
TABLE4 D
WHERE B.TABLE2_ID = A.TABLE1_ID
AND B.TABLE2_ACTIVE_IND = 'Y'
AND B.TABLE2_EFF_DATE =
(SELECT MAX (B2.TABLE2_EFF_DATE)
FROM TABLE2 B2
WHERE B2.TABLE2_ID = B.TABLE2_ID
AND B2.TABLE2_ACTIVE_IND = 'Y')
AND C.TABLE3_ID = A.TABLE1_ID
AND C.TABLE3_ACTIVE_IND = 'Y'
AND C.TABLE3_EFF_DATE =
(SELECT MAX (C2.TABLE3_EFF_DATE)
FROM TABLE3 C2
WHERE C2.TABLE3_ID = C.TABLE3_ID
AND C2.TABLE3_ACTIVE_IND = 'Y')
AND D.TABLE4_ID = A.TABLE1_ID
AND D.TABLE4_ACTIVE_IND = 'Y'
AND D.TABLE4_EFF_DATE =
(SELECT MAX (D2.TABLE4_EFF_DATE)
FROM TABLE4 D2
WHERE D2.TABLE4_ID = D.TABLE4_ID
AND D2.TABLE4_ACTIVE_IND = 'Y')
ORDER BY A.TABLE1_ID;
答
尝试:
SELECT DISTINCT A.TABLE1_ID,
A.TABLE1_COL1,
B.TABLE2_COL2,
C.TABLE3_COL3,
D.TABLE4_COL4
FROM TABLE1 A
JOIN (SELECT T2.*,
RANK() OVER (PARTITION BY TABLE2_ID ORDER BY TABLE2_EFF_DATE DESC) RN
FROM TABLE2 T2
WHERE TABLE2_ACTIVE_IND = 'Y') B ON B.TABLE2_ID = A.TABLE1_ID AND B.RN=1
JOIN (SELECT T3.*,
RANK() OVER (PARTITION BY TABLE3_ID ORDER BY TABLE3_EFF_DATE DESC) RN
FROM TABLE3 T3
WHERE TABLE3_ACTIVE_IND = 'Y') C ON C.TABLE3_ID = A.TABLE1_ID AND C.RN=1
JOIN (SELECT T4.*,
RANK() OVER (PARTITION BY TABLE4_ID ORDER BY TABLE4_EFF_DATE DESC) RN
FROM TABLE4 T4
WHERE TABLE4_ACTIVE_IND = 'Y') D ON D.TABLE4_ID = A.TABLE1_ID AND D.RN=1
ORDER BY A.TABLE1_ID;
感谢马克。一旦我将3个RN标签调整为唯一的,似乎可以工作。我最初得到了'ORA-00918:列明确定义'的错误。 – Brandon 2013-03-11 18:37:53
哎呀,我似乎错过了预选赛,例如“B.RN = 1”。 – Brandon 2013-03-11 18:44:23
@Brandon:最初,我忘了让RN标签独一无二 - 大约半小时后,我注意到我的疏忽并修复了它。 – 2013-03-12 10:26:49