【问题标题】:How to do an upper recursive self-join in SQL Server?如何在 SQL Server 中进行上递归自联接?
【发布时间】:2011-10-15 21:52:38
【问题描述】:

如何在 SQL Server 中进行递归自联接? 我有一张这样的桌子:

表ID |父母ID 1 |空值 2 | 1 3 | 1 4 | 3 5 |空值 6 | 4 7 | 6

我想根据给定的TableID 获得以下结果以获取与TableID 相关的所有ParentsID,假设我想获取TableID = 6 的所有父母:

表ID 6 4 3 1

我被困在这个问题上,我不知道如何在 SQL Query 中获得结果...... 希望能告诉我获取之前数据的SQL Query

【问题讨论】:

  • 标准 SQL 不支持递归查询。有一些扩展,例如 oracle 的“先验连接”,但它们是扩展和非标准的。这类事情的常用方法是在循环中执行一系列查询。
  • @MarcB 但他标记了 sql-server :-) 所以它是 tsql。
  • 也许HierarchyID 数据类型会使任务更容易,自 SQL Server 2008 起可用。

标签: sql-server recursive-query self-join


【解决方案1】:

应该是

; WITH MyQuery (TableID, ParentID, Level) AS
(
    SELECT M.TableID, M.ParentID, 0 AS Level 
        FROM MyTable M 
        WHERE M.TableID = 6 -- Here it's the row number where the query starts

    UNION ALL

    SELECT M.TableID, M.ParentID, Q.Level + 1 
        FROM MyTable M 
        INNER JOIN MyQuery Q ON M.TableID = Q.ParentID
)

SELECT * FROM MyQuery;

正如 Byers 所写,它是 Recursive Queries Using Common Table Expressions

Level 列是无用的(它不是“无用的无用”。它对您的要求毫无用处),我添加了它,因为它经常插入这些递归查询中。如果你不需要它,从它出现的 3 个地方删除它。

反向执行Level 似乎要复杂得多(所以祖父是0级,他的孩子是1级......)

请注意,此代码适用于 SQL Server >= 2005

【讨论】:

    猜你喜欢
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2010-12-17
    • 2015-05-21
    相关资源
    最近更新 更多