使用递归选择返回所有子项

时间:2013-05-10 15:45:08

标签: sql sql-server select common-table-expression recursive-query

大家好!我有一张图表。首先,我知道如何构建简单递归选择。我在 msdn 上阅读了一些信息。

This is my sample graph
在该图像中,您可以看到(例如)图形的顶部节点(编号为0)影响节点编号1(等(2-> 4),(3-> 4),(4-> 4)。 5),(5-> 6),(1-> 5))

任务:每个节点显示它影响的节点。例如, 数字1影响5和6。

结果SQL必须返回如下内容:

 who_acts| on_whom_influence 
 0       | 1
 0       | 5
 0       | 6
 1       | 5
 1       | 6
 2       | 4
 2       | 5
 2       | 6
 3       | 4
 3       | 5
 3       | 6
 4       | 5
 4       | 6
 5       | 6

使用anchor member CTE启动的数据是:

who_acts| on_whom_influence 
2       | 4
3       | 4
4       | 5
5       | 6
1       | 5
0       | 1

我可以使用SQL语法和递归选择进行此选择吗?我该怎么做?

1 个答案:

答案 0 :(得分:2)

这听起来像是一个直截了当的CTE。您可以在单独的列中传递影响的根:

; with  Influence as
        (
        select  who_acts
        ,       on_whom_influence
        ,       who_acts as root
        from    dbo.YourTable
        union all
        select  child.who_acts
        ,       child.on_whom_influence
        ,       parent.root
        from    Influence parent
        join    dbo.YourTable child
        on      parent.on_whom_influence = child.who_acts
        )
select  root
,       on_whom_influence
from    Influence
order by
        root
,       on_whom_influence

Example on SQL Fiddle.