sql-server - 时态表 - "Parameterise"扩展 SYSTEM_TIME 语法

标签 sql-server sql-server-2016 temporal

    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 ,然后将其包含在 wherecross 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/

相关文章:

sql-server - Entity Framework : Created a entity and insert data in table without primary key

sql - LEFT JOIN 最多为一对多关系返回一行

sql-server - SQL Server : Filter output of sp_who2

sql - 当相关行可能不存在时从连接表中进行选择

sql-server - 回填临时表

Java TIMESTAMP 有尾随零,我该如何删除?

c# - 相当于 C# BigInteger 的 SQL

sql - 计算(平均值)列的截尾平均值

database - 在数据库中存储以下时态数据的最佳方式

sql-server - SQL Azure 和对 CTE 语法的支持吗?