使用存储过程的SQL递归

时间:2014-11-14 19:23:52

标签: sql recursion common-table-expression

我有两个存储过程。第一个存储过程返回顶级父级,第二个过程将返回提供的父级ID的子级。每个孩子也可能是父母。

我在研究CTE时遇到的问题是,每个例子似乎都依赖于ID + 1,因为项目的ID不是连续的,所以它不会在这里工作。这里的任何指导将不胜感激。

1 个答案:

答案 0 :(得分:0)

这是一个快速CTE示例,演示如何确定查询中的深度。完整的SQL小提琴就在这里:http://www.sqlfiddle.com/#!6/5c3f47/1/0

WITH CTE AS (
    SELECT
        Records.Id,
        Records.Name,
        Records.ParentId,
        CONVERT(INT, 1) AS Depth
    FROM dbo.Records Records
    WHERE Records.ParentId IS NULL
    UNION ALL
    SELECT
        Records.Id,
        Records.Name,
        Records.ParentId,
        CTE.Depth + 1
    FROM CTE
        INNER JOIN dbo.Records Records
            ON CTE.Id = Records.ParentId
)
SELECT * FROM CTE

对于该示例,产生以下输出:

| ID |  NAME | PARENTID | DEPTH |
|----|-------|----------|-------|
|  1 |     A |   (null) |     1 |
|  2 |     B |   (null) |     1 |
|  5 |   B.1 |        2 |     2 |
|  3 |   A.1 |        1 |     2 |
|  4 |   A.2 |        1 |     2 |
|  6 | A.1.1 |        3 |     3 |
|  7 | A.1.2 |        3 |     3 |