[英]Join 2 tables based on the date of an event happening in table 1, being between start and end dates of table 2
[英]Join Tables on the basis of start date and end dates
子表
Start Date End Date Name Cd Parent1 Parent2
1/1/1900 3/6/2016 X X A B
3/6/2016 12/31/4712 X-1 X A B
父表1
Start Date End Date Name Cd Grand Parent
1/1/1900 2/5/2015 A A AA
2/5/2015 6/8/2016 A-1 A AA
6/8/2016 1/1/4712 A-2 A AA
祖父母表
Start Date End Date Name Cd
1/1/1900 2/7/2015 AA AA
2/7/2015 1/1/4712 AA-1 AA
父表2
Start Date End Date Name Cd
1 1/1/1900 1/1/2012 B B
2 1/1/2012 3/6/2016 B-1 B
我想要基於開始/結束日期的最終結果如下所示
Start Date C P1 GP P2
1/1/1900 X A AA B
1/1/2012 X A AA B-1
2/5/2015 X A-1 AA B-1
2/7/2015 X A-1 AA-1 B-1
3/6/2016 X-1 A-1 AA-1 B-2
6/8/2016 X-1 A-2 AA-1 B-2
1/1/2017 X-1 A-2 AA-1 B-3
2/2/2017 X-1 A-2 AA-2 B-3
有人可以幫我為上述情況TIA編寫SQL嗎
給定示例數據,這是一個解決方案。 我稱這些表為: childtable,parent1,parent2,gparent 。
我創建了一個名為DATE_RANGE的WITH子句,以僅獲取所需日期的列表。 您也可以在子查詢中執行此操作。
WITH DATE_RANGE AS (
select distinct start_date FROM childtable
union
select distinct start_date from parent1
union
select distinct start_date from gparent
union
select distinct start_date from parent2
)
SELECT
D.START_DATE,
C.START_DATE,
C.NAME C,
P1.NAME P1,
GP.NAME GP,
P2.NAME P2
FROM
DATE_RANGE D
JOIN CHILDTABLE C ON C.END_DATE > D.START_DATE
JOIN PARENT1 P1 ON P1.CD = C.PARENT1 AND P1.END_DATE > D.START_DATE
JOIN GPARENT GP ON GP.CD = P1.GPARENT AND GP.END_DATE > D.START_DATE
JOIN PARENT2 P2 ON P2.CD = C.PARENT2 AND P2.END_DATE > D.START_DATE
WHERE
C.START_DATE = ( SELECT MIN(START_DATE) FROM CHILDTABLE C2
WHERE C2.END_DATE > D.START_DATE ) and
P1.START_DATE = ( SELECT MIN(START_DATE) FROM PARENT1 P12
WHERE P12.END_DATE > D.START_DATE ) and
GP.START_DATE = ( SELECT MIN(START_DATE) FROM GPARENT GP2
WHERE GP2.END_DATE > D.START_DATE ) and
P2.START_DATE = ( SELECT MIN(START_DATE) FROM PARENT2 P22
WHERE P22.END_DATE > D.START_DATE )
ORDER BY D.START_DATE
;
子查詢示例:
SELECT D.START_DATE, C.START_DATE, C.NAME C
,P1.NAME P1 ,GP.NAME GP ,P2.NAME P2
FROM
( select distinct start_date FROM childtable
union
select distinct start_date from parent1
union
select distinct start_date from gparent
union
select distinct start_date from parent2) D
JOIN CHILDTABLE C ON C.END_DATE > D.START_DATE
JOIN PARENT1 P1 ON P1.CD = C.PARENT1 AND P1.END_DATE > D.START_DATE
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.