我有2个与父子关系(E1是父关系)相关的SQL表(E1,E2)。 每次在记录上执行更新时,都会创建新记录(时间/历史记录)。
我想得到,使用左连接查询(孩子不存在),在记录的生命周期内他们关系的所有不同状态
Sample E1:
Id StartDate EndDate Value
----------------------------------------------------
1 2017-11-01 2017-11-05 Initial E1 (Day 1)
1 2017-11-05 2017-11-14 E1 (update Day 5)
1 2017-11-14 9999-12-31 E1 (Update Day 14)
Sample E2:
Id StartDate EndDate Value E1_Id
---------------------------------------------------------------
1 2017-11-03 2017-11-12 Initial E2 (Day 3) 1
1 2017-11-12 9999-12-31 E2 (Day 12) 1
我(天真地)期望使用左连接查询获得关系的每个状态,其中“ON”组合ID以及StartDate和EndDate。 但是,我没有为孩子不存在的时间段获得任何行(我期望11月1日至3日之间的时段记录)。
select *
from e1
left join e2 on e1.id = e2.E1_Id
and e1.StartDate < e2.EndDate
and e1.EndDate >= e2.StartDate
Id StartDate EndDate Value Id StartDate EndDate Value E1_Id
-------------------------------------------------------------------------------------------------------------------------
1 2017-11-01 2017-11-05 Initial E1 (Day 1) 1 2017-11-03 2017-11-12 Initial E2 (Day 3) 1 temporal validity: 3-5 nov
1 2017-11-05 2017-11-14 E1 (update Day 5) 1 2017-11-03 2017-11-12 Initial E2 (Day 3) 1 temporal validity: 5-12 nov
1 2017-11-05 2017-11-14 E1 (update Day 5) 1 2017-11-12 9999-12-31 E2 (Day 12) 1 temporal validity: 12-14 nov
1 2017-11-14 9999-12-31 E1 (Update Day 14) 1 2017-11-12 9999-12-31 E2 (Day 12) 1 temporal validity: from 14 nov
As the first 1 records, I was expecting this extra record
Id StartDate EndDate Value Id StartDate EndDate Value E1_Id
-------------------------------------------------------------------------------------------------------------------------
1 2017-11-01 2017-11-03 Initial E1 (Day 1) 1 <Null> <NULL> <NULL> <NULL> temporal validity: 1-3 nov.
…..
[编辑预期的结束(是nov 5,必须是nov 3)]。 我们的想法是在输出查询中跟踪我们在父子关系中的每一个变化
有没有人有想法正确获取信息?
谢谢, 何
答案 0 :(得分:0)
好像你在考虑两种类型的孩子:
并且您希望查看两种情况的记录,当特定子项不存在时,可能会显示null
个值。
在这种情况下,您可以为这两种不同的情况创建两个单独的查询,然后获取结果的并集:
select *
from e1
left join e2
on e1.id = e2.E1_Id
and e1.StartDate between e2.StartDate and e2.EndDate
union
select *
from e1
left join e2
on e1.id = e2.E1_Id
and e1.EndDate between e2.StartDate and e2.EndDate
where e1.EndDate < '9999-12-31'
order by 2, 6;
特殊日期的最后一个条件可能是你想要的,因为那个日期似乎真的意味着“无限”,所以它不应该包含在任何时期。但是,如果没有这个条件,请尝试查看从中获得的内容。