SELECT *
FROM Spine S
CROSS
APPLY
(
SELECT *
FROM PersonTemporalTable
FOR SYSTEM_TIME AS OF S.DateTimeValueOfInterest
) CA
如果我遗漏了"为什么"这会更简单。并且坚持"什么"和"如何"。 我需要能够在特定时间点查询Temporal表以获取记录状态 - 如果语法合法,那么它将完全符合我的要求。 在这种情况下,Spine表包含一个感兴趣的DATETIME值列表。
这只是不使用正确语法的问题还是限制? 除了使用动态SQL之外,你们还有其他建议吗?
提前致谢!
这是我根据@SQLZim
的建议做的事情SELECT *
FROM Spine SP
JOIN PetTemporal FOR SYSTEM_TIME ALL PT ON SP.SpineDT >= PT.ValidFrom AND SP.SpineDT < PT.ValidTo
JOIN PersonTemporal FOR SYSTEM_TIME ALL PS ON SP.SpineDT >= PS.ValidFrom AND SP.SpineDT < PS.ValidTo
AND PS.PersonID = PT.PersonID
答案 0 :(得分:4)
如果您希望返回html {
min-height:100%;
position:relative;
}
body {
overflow:hidden;
}
.container {
width:100%;
overflow:auto;
}
.left_frame {
float:left;
background:#E8F1F5;
width:25%;
height:100vh;
}
.right_frame {
float:right;
background:#FAFAFA;
width:75%;
height:100vh;
}
.right_frame iframe {
display:block;
width:100%;
height:100%;
border:none;
}
行,即使Spine
中没有相应的行,请切换为PersonTemporalTable
。
如果outer apply()
包含有效日期范围:
PersonTemporalTable
如果select *
from Spine S
cross apply (
select ptt.*
from PersonTemporalTable
where ptt.FromDateTime <= S.DateTimeValueOfInterest
and ptt.ThruDateTime >= S.DateTimeValueOfInterest
) CA
包含单个生效日期:
PersonTemporalTable
如果这应该返回两个表共享相应密钥的行,例如select *
from Spine S
cross apply (
select top 1 ptt.*
from PersonTemporalTable ptt
where ptt.EffectiveDate <= S.DateTimeValueOfInterest
order by ptt.EffectiveDate desc
) CA
,然后将其包含在PersonId
的{{1}}中,例如:
where
利用扩展cross apply()
语法的另一个选项:您可以创建一个内联表值函数,以便与select *
from Spine S
cross apply (
select top 1 ptt.*
from PersonTemporalTable ptt
where ptt.EffectiveDate <= S.DateTimeValueOfInterest
and ptt.PersonId = S.PersonId
order by ptt.EffectiveDate desc
) CA
一起使用,如下所示:
system_time as of
dbfiddle.uk演示:http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=f1ee20893fe987e71cbd0cb12d09fccb