选择所有层次结构级别和SQL Server下面

JDB*_*ett 6 sql sql-server stored-procedures

我正忙着玩这个.我已经看到了一些关于如何从给定父级的自引用表中获取所有子记录以及如何获取子记录的父级的示例.

我想要做的是返回一个记录和所有给出ID的子记录.

把它放到上下文中 - 我有一个公司层次结构.哪里:

#Role        Level#
--------------------
Corporate         0
Region            1
District          2
Rep               3
Run Code Online (Sandbox Code Playgroud)

我需要的是一个程序,(1)确定记录的级别,(2)检索记录和所有子记录.

作为一个地区的想法可以看到一个地区的所有地区和代表,地区可以看到他们的代表.经销商只能看到自己.

我有桌子:

ID            ParentId           Name
-------------------------------------------------------
1             Null               Corporate HQ
2             1                  South Region
3             1                  North Region
4             1                  East Region
5             1                  West Region
6             3                  Chicago District
7             3                  Milwaukee District
8             3                  Minneapolis District
9             6                  Gold Coast Dealer
10            6                  Blue Island Dealer
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢:

CREATE PROCEDURE GetPositions
    @id int
AS
BEGIN
    --What is the most efficient way to do this--
END
GO
Run Code Online (Sandbox Code Playgroud)

例如@id = 3的预期结果,我想返回:

3, 6, 7, 8, 9, 10
Run Code Online (Sandbox Code Playgroud)

我很感激任何帮助或想法.

Fel*_*tan 8

你可以通过递归CTE来做到这一点:

DECLARE @id INT = 3;

WITH rCTE AS(
    SELECT *, 0 AS Level FROM tbl WHERE Id = @id
    UNION ALL
    SELECT t.*, r.Level + 1 AS Level
    FROM tbl t
    INNER JOIN rCTE r
        ON t.ParentId = r.ID
)
SELECT * FROM rCTE OPTION(MAXRECURSION 0);
Run Code Online (Sandbox Code Playgroud)

ONLINE DEMO