SELECT *
FROM Spine S
CROSS
APPLY
(
SELECT *
FROM PersonTemporalTable
FOR SYSTEM_TIME AS OF S.DateTimeValueOfInterest
) CA
如果我忽略“为什么”而只关注“什么”和“如何”,事情会简单得多。 我需要能够查询临时表以获取特定时间点的记录状态 - 如果上述语法合法,那么它将完全符合我的要求。 在本例中,表 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
最佳答案
如果您想返回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
,然后将其包含在 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
的选项语法:您可以创建一个内联表值函数以与 cross apply()
一起使用像这样:
create function dbo.PersonTemporalTable_AsOf (@fromdate datetime2(7)) returns table as return (
select *
from PersonTemporalTable
for system_time as of @fromdate
)
go
select *
from spine s
cross apply dbo.PersonTemporalTable_AsOf(s.DateTimeValueOfInterest) ca
dbfiddle.uk 演示:http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=f1ee20893fe987e71cbd0cb12d09fccb
关于sql-server - 时态表 - "Parameterise"扩展 SYSTEM_TIME 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44374390/