0

大家好!我有一张图。首先,我知道如何构建简单的递归选择。我读了一些关于msdn的信息。用递归选择退回所有的孩子

This is my sample graph
在该图像可以看到(例如)图的顶部节点,其被编号为0,影响节点号1(等(2-> 4),(3-> 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 

,我可以开始使用CTE的anchor member开始的数据是:

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

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

+0

我不明白,你有什么期望的最终结果?您能否从样本数据中显示您想要的结果,这可能会使其更清晰。 – 2013-05-10 15:49:20

+0

您应该包含您的表格定义和当前锚点查询。样本结果是@Joachim的第一个代码块。它是节点(who_acts)及其所有子节点(on_whom_influence)的列表。 – 2013-05-10 15:53:36

+0

@JoachimIsaksson,@ EsotericScreenName结果是“结果SQL必须返回类似结果”之后的第一个块。这是结果。 – NDGO 2013-05-10 15:58:53

回答

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.

+0

好的,我会正确地读它。 – NDGO 2013-05-10 16:04:33