sql - 获取层次结构表中子项的根父项

标签 sql sql-server sql-server-2008 sql-server-2008-r2

我有一个包含分层数据的表,结构如下:

ID      ParentId
----   ----------
1       NULL
2       1
3       2
4       2
5       3
6       5

如果我传递节点 ID,我希望通过在 SQL 中遍历其所有父节点来获取最顶层的节点 ID/详细信息。

我尝试了 CTE,但不知何故无法获得正确的组合。然而,我把它作为一个函数来工作,但它太慢了,我不得不发布这个问题。

在上面的例子中,如果我通过 6,我希望得到最上面的值,即 1。通过遍历 6 => 5 => 3 => 2 => [1](结果)

预先感谢您的帮助。

最佳答案

DECLARE @id INT = 6
;WITH parent AS
(
    SELECT id, parentId, 1 AS [level] from tbl WHERE id = @id
    UNION ALL 
    SELECT t.id, t.parentId, [level] + 1 FROM parent
    INNER JOIN tbl t ON t.id =  parent.parentid
)
SELECT TOP 1 id FROM parent ORDER BY [level] DESC

@TechDo 的答案假设最低的 ID 将是父级。如果您不想依赖于此,则上述查询将按深度排序。

关于sql - 获取层次结构表中子项的根父项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24523560/

相关文章:

mysql - ./libraries/plugin_interface.lib.php#551 count() : Parameter must be an array or an object that implements Countable 中的警告

sql - 将阿拉伯语存储在 SQL 数据库中

python - pymssql: executemany value error - 需要一个简单的类型,一个元组或一个列表

oracle - OraOLEDB.Oracle 未显示在 SQL Server Management Studio 提供程序中

sql - 将关联表展平为多值列?

php - 不正确的 SQL 语法错误消息

php - 在 SQL 查询中做简单的数学运算

sql-server - 在sql中使用循环创建多个表

php - 检索多个复选框并在表格中显示数据库中的其他相关信息

sql-server - Docker 容器可以在重启之间保持状态吗?