簡體   English   中英

根據開始日期和結束日期聯接表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM