SQL Server单表查询当前版本关联的所有历史版本
在SQL Server中查询文档的所有前置历史版本
可以使用**递归公共表表达式(CTE)**实现单个SELECT查询,获取指定版本的所有前置历史版本,以下是具体实现方案:
假设你的表名为Documents(如果表名不同,请自行替换),执行以下SQL即可获取Test1 Version C的所有前置版本:
WITH DocumentVersions AS ( -- 锚点:定位目标版本(Test1 Version C) SELECT ID, NAME, VERSION, VERSION_ID FROM Documents WHERE NAME = 'Test1' AND VERSION = 'C' UNION ALL -- 递归:逐级向上关联父版本 SELECT d.ID, d.NAME, d.VERSION, d.VERSION_ID FROM Documents d INNER JOIN DocumentVersions dv ON d.ID = dv.VERSION_ID ) -- 排除目标版本本身,返回所有前置历史版本 SELECT ID, NAME, VERSION FROM DocumentVersions WHERE ID != (SELECT ID FROM Documents WHERE NAME = 'Test1' AND VERSION = 'C') -- 若版本层级超过100,取消递归深度限制 OPTION (MAXRECURSION 0);
代码说明:
- 锚点成员:精准定位到你需要查询的目标版本,作为递归的起始点。
- 递归成员:通过
VERSION_ID与原表的ID关联,循环获取上一版本的记录,直到没有父版本(VERSION_ID为NULL)为止。 - 最终查询:排除目标版本本身,仅返回所有前置历史版本;
OPTION (MAXRECURSION 0)用于取消SQL Server默认的100层递归限制,适用于版本层级较多的场景。
执行上述SQL后,将返回你期望的结果:
| ID | NAME | VERSION |
|---|---|---|
| 1 | Test1 | A |
| 2 | Test1 | B |
如果需要查询其他文档或版本,只需修改锚点成员中的WHERE条件即可。
内容的提问来源于stack exchange,提问作者Reality80
相关产品推荐
相关产品推荐

