2011-04-08 84 views
1

HI
我有以下各表加入查詢

========================= 
Periods 
========================= 
PeriodID StartDate EndDate 
1   01-01-11 07-01-11 
2   08-01-11 15-01-11 

等了整整一年

========================= 
History 
========================= 
PersonID From  To 
1   01-01-11 05-04-11 
2   17-06-11 NULL 
and so on 

我想下面的輸出

StartDate EndDate PersonID 
    01-01-11 07-01-11 1 
    08-01-11 15-01-11 1 
    . 
    . 
    15-04-11 21-04-11  NULL 
    . 
    . 
    15-06-11 21-06-11  2 

我需要採取這兩個表之間的連接,但我不知道連接條件將如何看起來像

Ragards

+0

IS歷史與用戶表的多對多關係? – ysrb 2011-04-08 13:04:08

+0

@ysrb一段時間內只能有一個人同時登錄 – Tassadaque 2011-04-08 13:06:28

+0

好的,讓我試試看。還有一件事在歷史表中,開始日期和結束日期不一定與期間表匹配,即這些日期可能是一年中的任何日期 – Tassadaque 2011-04-08 13:10:10

回答

4
SELECT 
    p.StartDate, 
    p.EndDate, 
    h.PersonID 
FROM Periods p 
    LEFT JOIN History h 
    ON h.[From] BETWEEN p.StartDate AND p.EndDate OR 
     p.StartDate BETWEEN h.[From] AND ISNULL(h.[To], '30000101') 
1

能否請您嘗試:

SELECT P.StartDate, P.EndDate, H.PersonID 
FROM Period P INNER JOIN History H ON P.StartDate <= H.Fromand (P.EndDate >= H.To OR H.To IS NULL) 

我也更清楚地讀取規格

我又編輯了SQL編輯後的SQL。我正在使用INNER JOIN。

+0

對於所有記錄 – Tassadaque 2011-04-08 13:26:54

+0

它都顯示相同的personID = 1它不能作爲內連接,因爲即使沒有該段時間的歷史條目,它也需要顯示週期(請看輸出的第5行) – clyc 2011-04-08 20:53:25

1

它會影響性能,但我認爲這是值得只是想之間的奇數尋找:

select x 
from table1 t1 
    inner join table2 t2 
    on t2.date between t1.startdate and t1.enddate 

它是否有效與否將取決於這是否是要生產,或只是一個時間的事情,以及涉及多少記錄。它可能太慢了。

1

即使沒有與該期間相關的歷史記錄條目,您也需要執行左連接才能顯示所有可用期間。如果歷史日期在期間之間,則標準爲。您還需要檢查是否要日期是無效的,包括到您的結果

SELECT p.StartDate, p.EndDate, h.PersonId 
FROM Period p 
     LEFT JOIN History h 
      ON p.StartDate >= h.[From] AND 
      (h.[To] IS NULL OR p.EndDate <= h.[To]) 
+0

輸出正在返回期間的所有記錄,如期望它正在顯示personid = 1,但其中personID = 2應該顯示它顯示爲空 – Tassadaque 2011-04-08 13:35:39

+0

p.EndDate IS NULL應該是h.EndDate對嗎?當我改變,我錯過了一個在17-06-11 – Tassadaque 2011-04-08 13:50:50

+0

@Tassadaque範圍內,我有一個錯字。它不應該檢查p.EndDate爲空,而是應該檢查h。[To]列是否爲空。 – clyc 2011-04-08 13:51:23

-1

在餐桌上的「歷史」,設置爲NULL「9999-12-31」

SELECT *從歷史a內部加入歷史b在a.from < b.to和a.to> b.from

+1

不!這是一個非常醜陋,不可移植的黑客攻擊。而是明確地測試'NULL'。 – RandomSeed 2015-03-11 12:51:53