如何在视图中为FOR SYSTEM_TIME AS OF子句使用动态值?
解决系统版本化表关联查询的语法问题与优化方案
语法错误原因及修正写法
你遇到的语法错误是因为FOR SYSTEM_TIME AS OF子句不支持嵌套关联外部表的子查询,它需要接收确定的时间值或能直接关联的字段。可以先通过CTE将联系人与对应的账户版本生效时间关联,再用该时间查询账户通用信息的历史版本:
WITH ContactAccountVersion AS ( SELECT c.[Contact No], c.[Account No], a.[Valid From] AS AccountValidFrom FROM [Contact] c JOIN [Account] a ON c.[Account No] = a.[Account No] AND a.[Version No] = c.[Account Version No] ) SELECT cav.[Contact No], ag.[Name] FROM ContactAccountVersion cav JOIN [Account_General] ag FOR SYSTEM_TIME AS OF cav.AccountValidFrom ON cav.[Account No] = ag.[Account No]
版本记录方式的选择
保留Account Version No是合理的——毕竟版本号比日期更直观,符合前端用户选择需求。只需确保Account表中Version No与Valid From是一一对应的,每个版本号绑定唯一的生效时间,避免版本与时间映射混乱。
更优的表结构优化建议
- 统一子表与主表的版本化规则:既然Account_General是Account的子表,且账户或子数据修改时Account的Version No递增,可给Account_General也添加
Version No字段,与Account的版本同步更新。查询时直接通过Account No和Version No关联,无需依赖时间查询历史版本:
SELECT c.[Contact No], ag.[Name] FROM [Contact] c JOIN [Account_General] ag ON c.[Account No] = ag.[Account No] AND c.[Account Version No] = ag.[Version No]
- 双字段记录版本信息:如果担心版本号与时间的映射出现偏差,可在Contact表同时存储
Account Version No和Valid From。前端用版本号展示选择,查询时用时间字段匹配历史数据,兼顾易用性与查询准确性。
内容的提问来源于stack exchange,提问作者Leah
相关产品推荐
相关产品推荐

