我不确定这里的术语,所以让我举个例子。我有这个问题:
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中。
答案 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
这不是最好的方法,但确实有效。 它获取事件中指定的时段的最小和最大日期范围。 使用这两个日期,它与句点表连接在两者之间的范围内的值。
克里斯