在类似临时的sql表上执行外连接 - 如何获得每个时态?

时间:2017-11-09 20:44:34

标签: sql sql-server join temporal

我有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)]。 我们的想法是在输出查询中跟踪我们在父子关系中的每一个变化

有没有人有想法正确获取信息?

谢谢, 何

1 个答案:

答案 0 :(得分:0)

好像你在考虑两种类型的孩子:

  • E2中包含E1记录的StartDate和
  • 的那些
  • E2中包含E1记录的EndDate的那些

并且您希望查看两种情况的记录,当特定子项不存在时,可能会显示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; 

特殊日期的最后一个条件可能是你想要的,因为那个日期似乎真的意味着“无限”,所以它不应该包含在任何时期。但是,如果没有这个条件,请尝试查看从中获得的内容。