首页 > 解决方案 > Sql Server 2014 - 深度递归父子自加入

问题描述

我正在尝试构建一个深度递归自联接查询。有这样的表:

Id | ParentId
1  | NULL
2  | 1
3  | 1
4  | 2
5  | 3
6  | 8
7  | 9

对于 ID 1,我的查询应该获取 1、2、3、4、5,因为它们要么是 1 的孩子,要么是 1 的孩子的孩子。在给定的示例中,6 和 7 不应包含在查询结果中。

我尝试使用 CTE,但我得到了大量的重复项:

WITH CTE AS (
    SELECT Id, ParentId
    FROM dbo.Table
    WHERE ParentId IS NULL
UNION ALL
    SELECT t.Id, t.ParentId
    FROM dbo.Table t
    INNER JOIN CTE c ON t.ParentId = c.Id
)
SELECT * FROM CTE

想法?

标签: sqlsql-serverrecursionrecursive-query

解决方案


您可以尝试使用DISTINCT来过滤重复的行。

;WITH CTE AS (
    SELECT Id, ParentId
    FROM T
    WHERE ParentId IS NULL
UNION ALL
    SELECT t.Id, t.ParentId
    FROM T
    INNER JOIN CTE c ON t.ParentId = c.Id
)
SELECT DISTINCT Id, ParentId
FROM CTE

推荐阅读