【问题标题】:SQL Recursion using stored procedures使用存储过程的 SQL 递归
【发布时间】:2014-11-14 19:23:52
【问题描述】:

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

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

【问题讨论】:

  • 好吧,我不确定从哪里开始。我知道这个问题需要递归,但是我能找到的关于 CTE 的所有示例都需要某种形式的顺序 id,可以递增或递减以获取下一条数据,这在此处不起作用。
  • 从实际陈述您的问题开始,向我们展示您的查询和错误
  • 你能提供一些ID的例子吗?数据库中的关系是如何维护的?表有父列和子列吗?
  • 您没有正确阅读示例 - 递归可能加入 level + 1,而不是 ID + 1。
  • 只要表格有 ID 和 ParentID,CTE 就可以工作。但是,当 ID 没有父母时,我假设 parentID 为 NULL。否则,如果存在循环,您可能会进行无限递归...

标签: sql recursion common-table-expression


【解决方案1】:

这是一个快速 CTE 示例,展示了如何确定查询中的深度。完整的 SQL Fiddle 在这里: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 |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2015-08-08
    • 1970-01-01
    • 2018-11-09
    • 2013-11-13
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多