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 :(得分:5)
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 :(得分: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。
答案 2 :(得分:1)
这会影响性能,但我认为值得尝试奇怪的看法:
select x
from table1 t1
inner join table2 t2
on t2.date between t1.startdate and t1.enddate
它是否有效将取决于这是生产,还是只是一次性,以及涉及多少记录。这可能太慢了。
答案 3 :(得分:1)
您需要执行左连接才能显示所有可用期间,即使没有与该期间关联的历史记录条目也是如此。如果历史日期在期间之间,则标准是。您还需要检查To date是否为null并将其包含在结果中
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])
答案 4 :(得分:-1)
在表格&#39;历史&#39;,将NULL设置为&#39; 9999-12-31&#39;
从a.from&lt;中的内部联接历史记录b中选择* b.to和a.to&gt; b.from