如何使用FOR SYSTEM_TIME连接SQL Server时态表查看跨表历史变更
SQL Server时态表People与Pets全历史关联查询
要实现People(含当前及历史数据)与Pets的全关联历史查询,核心是匹配两个时态表中有效时间段存在重叠的记录,具体SQL语句如下:
SELECT p.Name AS 人员姓名, p.Address AS 住址, pt.Name AS 宠物姓名 FROM People FOR SYSTEM_TIME ALL p INNER JOIN Pets FOR SYSTEM_TIME ALL pt ON p.ID = pt.PeopleID -- 关键条件:两个时态记录的有效时间段存在交集 AND p.ValidFrom < pt.ValidTo AND p.ValidTo > pt.ValidFrom ORDER BY p.Name, p.ValidFrom, pt.ValidFrom;
逻辑说明
FOR SYSTEM_TIME ALL:取出对应时态表的所有当前版本及历史版本数据,涵盖所有时间维度的记录。- 关联条件:
- 基础匹配:
p.ID = pt.PeopleID确保宠物属于对应人员 - 时间重叠校验:
p.ValidFrom < pt.ValidTo AND p.ValidTo > pt.ValidFrom保证人员的某段住址生效期间,宠物的记录也处于有效状态(包括宠物在该期间内的变更,比如从Rover更换为Rusty的情况)。
- 基础匹配:
该查询会输出符合预期的结果,比如:
- Bob, Address 1, Rover
- Bob, Address 2, Rover
- Bob, Address 2, Rusty
- Bob, Address 3, Rusty
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

