【发布时间】:2015-04-24 10:51:53
【问题描述】:
在 SQL Server 中使用 CTE 递归时,有没有办法显示 SQL Server 正在使用的路径 ID?
假设我有下表表示相互连接的边:
CREATE TABLE c(id int, n1 int, n2 int);
insert into c( id, n1, n2 ) values ( 100, 1, 2);
insert into c( id, n1, n2 ) values ( 101, 2, 3 );
insert into c( id, n1, n2 ) values ( 102, 3, 4 );
insert into c( id, n1, n2 ) values ( 103, 4, 8 );
insert into c( id, n1, n2 ) values ( 104, 3, 11 );
insert into c( id, n1, n2 ) values ( 105, 11, 12 );
我现在可以使用以下递归查询来显示哪些节点相互连接:
WITH Nodes
AS
(
select c.id, c.n1, c.n2, 1 as level from c where id = 100
UNION ALL
select c.id, c.n1, c.n2, level+1 from c inner join Nodes on Nodes.n2 = c.n1 where c.id != 100
)
SELECT id, n1, n2, level from Nodes where level > 1 order by id;
这将给出以下结果:
id n1 n2 level
101 2 3 2
102 3 4 3
103 4 8 4
104 3 11 3
105 11 12 4
有 2 条路径,101-102-103 和 101-104-105。我想识别每条路径,但我认为它们实际上等于 SQL Server 正在使用的递归路径,所以如果我有办法获取这个递归路径 id,那么我可以识别每条唯一路径。
我希望我的输出看起来像这样:
id n1 n2 level path_id
101 2 3 2 1
102 3 4 3 1
103 4 8 4 1
104 3 11 3 2
105 11 12 4 2
如您所见,在节点 104 处遇到了第二条路径或递归。这些是构成路径的节点:
path 1 : 101 - 102 - 103
path 2 : 104 - 105
每条路径实际上从节点 100 开始,但它被 'level>1' 子句排除在结果之外。
谢谢,斯蒂夫
【问题讨论】:
-
结果应该如何相似?您想要包含两行且每行包含完整路径的结果吗?
-
嗨 Georg,我想要一个额外的列 'path_id' 附加
-
好的,但是,您需要输出 id 为“101”的行两次,一次是 path_id “1”,一次是 path_id “2”
标签: sql-server common-table-expression recursive-query