父子层次结构的递归查询。从顶级节点获取后代

时间:2017-11-29 19:42:41

标签: sql hierarchical-data recursive-query

我有一个表,它以父子格式存储层次结构数据,并带有一个顶级节点。多个级别,每个父级有多个子级。如何编写递归查询以仅选择从特定节点到最后一个子节点的父子行?

示例表

Parent|child 
1     |2 
1     |3 
2     |4 
2     |5 
3     |6 
3     |7 
6     |8

如何只检索节点3及其所有后代的行?

1 个答案:

答案 0 :(得分:3)

如果您的DBMS是SQL Server,您可以使用递归通过公用表表达式(CTE)完成此操作。我相信这适用于所有版本2008R2及更高版本。以下查询将为您提供3个后代的所有父子关系。

CREATE TABLE dbo.ParentChildRel
(
    Parent INT
   ,Child INT
)

INSERT INTO dbo.ParentChildRel
VALUES (1,2)
      ,(1,3)
      ,(2,4)
      ,(2,5)
      ,(3,6)
      ,(3,7)
      ,(6,8)
      ,(7,10)

;WITH Hierarchy AS
    (
        SELECT Parent   
              ,Child
        FROM dbo.ParentChildRel
        WHERE Parent = 3
        UNION ALL
        SELECT rel.Parent
              ,rel.Child
        FROM Hierarchy hier
             INNER JOIN dbo.ParentChildRel rel ON hier.Child = rel.Parent
    )
SELECT *
FROM Hierarchy

结果

Parent  Child
3       6
3       7
7       10
6       8