You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在视图中为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:22:18