【问题标题】:Returning all children with a recursive select使用递归选择返回所有孩子
【发布时间】:2013-05-10 15:45:08
【问题描述】:

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


在此图像中,您可以看到(例如)图的顶部节点(编号为 0)影响节点编号 1(等 (2->4)、(3->4)、(4->5)、 (5->6), (1->5))

TASK:对于每个节点显示它影响的节点。例如, 数字 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 语法和递归选择进行此选择吗?我该怎么做?

【问题讨论】:

  • 我不明白,你想要的最终结果是什么?您能否从示例数据中显示您想要的结果,这可能会更清楚。
  • 你应该包括你的表定义和当前的锚查询。 @Joachim 示例结果是第一个代码块。它是节点 (who_acts) 及其任意深度的所有子节点 (on_whom_influence) 的列表。
  • @JoachimIsaksson ,@EsotericScreenName 结果是 "as the result SQL must return something like this" 之后的第一个块。这就是结果。
  • @JoachimIsaksson 不,那想要的结果。基础数据仅通过图像出现在问题中。
  • @EsotericScreenName 好的,包含的图片很有意义:)

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


【解决方案1】:

这听起来像是一个简单的 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    相关资源
    最近更新 更多