2009-10-13 72 views
1

我不確定這裏的術語,所以讓我舉個例子。我有這個疑問:加入派生表

SELECT * FROM Events 
-------------------- 

Id Name  StartPeriodId EndPeriodId 
1 MyEvent 34    32 

在這裏,PeriodIds指定事件持續多久的,認爲它是另一個表中規定如果那幫助當年周。請注意,EndPeriodId不一定是在StartPeriodId之後的順序。所以,我可以這樣做:

SELECT * FROM Periods WHERE Id = 34 
----------------------------------- 

Id StartDate EndDate 
34 2009-06-01 2009-08-01 

請不要糾纏於這種結構,因爲它只是一個例子,而不是如何實際工作。我需要做的是拿出這個結果集:

Id Name PeriodId 
1 MyEvent 34 
1 MyEvent 33 
1 MyEvent 32 

換句話說,我需要爲事件存在的每個週期選擇一個事件行。我可以很容易地計算期間信息(32,33,34),但是我的問題在於通過單個查詢將其拉出。

這是在SQL Server 2008中

回答

3

我可能是錯誤的,因爲有沒有可用的SQL Server現在我現在不能測試,但不會簡單地是:

SELECT  Events.Id, Events.Name, Periods.PeriodId 
FROM  Periods 
INNER JOIN Events 
ON   Periods.ID BETWEEN Events.StartPeriodId AND Events.EndPeriodId 
+0

不完全是,因爲正如我在質詢時說,「請注意,EndPeriodId不一定是StartPeriodId後順序」。這意味着你不能依賴BETWEEN並需要查看期間的實際日期。 – 2009-10-13 18:08:26

+0

看起來我可以使用類似的東西,但我只是在檢查! – 2009-10-13 18:13:11

+0

我愛你馬克西米利安邁爾。 – 2009-10-13 18:28:51

0

我假設你想要列出所有在開始/結束期間ID指定的期間之間的期間。

With CTE_PeriodDate (ID, MaxDate, MinDate) 
as (
Select Id, Max(Dates) MaxDate, MinDate=Min(Dates) from (
Select e.ID, StartDate as Dates from Events e 
Inner join Periods P on P.ID=StartPeriodID 
Union All 
Select e.ID, EndDate from Events e 
Inner join Periods P on P.ID=StartPeriodID 
Union All 
Select e.ID, StartDate from Events e 
Inner join Periods P on P.ID=EndPeriodID 
Union All 
Select e.ID, EndDate from Events e 
Inner join Periods P on P.ID=EndPeriodID) as A 
group by ID) 
Select E.Name, P.ID from CTE_PeriodDate CTE 
Inner Join Periods p on 
(P.StartDate>=MinDate and P.StartDate<=MaxDate) 
and (p.EndDate<=MaxDate and P.EndDate>=MinDate) 
Inner Join Events E on E.ID=CTE.ID 

這不是最好的辦法,但它確實有效。 它獲得事件中指定時段的最小和最大日期範圍。 使用這兩個日期,它將與週期表一起加入兩者之間範圍內的值。

克里斯