时间表 - "参数化"扩展SYSTEM_TIME语法

时间:2017-06-05 17:27:20

标签: sql-server sql-server-2016 temporal

    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

1 个答案:

答案 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