今天在优快云上看到一个帖子.帖子如下:
有一张表
站点1 站点2
A B
B C
C D
B E
E D
查询时提供A,D两点怎么出来路径?
A-B-C-D
A-B-E-D
看到这上问题,第一印象就是这是一个递归调用,正好前些日子看 SQL server 2005技术内幕 中有关的CTE递归方法,就用来试了一下.
代码如下:
CREATE TABLE #temp
(
siteA varchar(5),
siteB varchar(5)
)
INSERT #temp
SELECT 'A','B' UNION ALL
SELECT 'B','C' UNION ALL
SELECT 'C','D' UNION ALL
SELECT 'B','E' UNION ALL
SELECT 'E','D'
SELECT * FROM #temp;
WITH a AS
(
SELECT siteA,siteB,cast(siteA +'-'+siteB AS varchar(100))as paths,1 as num FROM #temp
UNION ALL
SELECT t.siteA,t.siteB, cast(a.paths +'-'+t.siteB AS varchar(100))as paths,num+1 FROM a JOIN #temp AS t ON a.siteB=t.siteA
)
SELECT * FROM a
结果如下"
siteA siteB Paths Num
A B A-B 1
B C B-C 1
C D C-D 1
B E B-E 1
E D E-D 1
E D B-E-D 2
C D B-C-D 2
B C A-B-C 2
B E A-B-E 2
E D A-B-E-D 3
C D A-B-C-D 3
这里num是循环的层数