加入衍生表

时间:2009-10-13 17:44:45

标签: tsql

我不确定这里的术语,所以让我举个例子。我有这个问题:

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中。

2 个答案:

答案 0 :(得分:3)

我可能错了,我现在无法测试,因为现在没有可用的SQL Server,但不会那么简单:

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

答案 1 :(得分: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

这不是最好的方法,但确实有效。 它获取事件中指定的时段的最小和最大日期范围。 使用这两个日期,它与句点表连接在两者之间的范围内的值。

克里斯