查询在SQL中找到给定节点的所有父节点和子节点
Query to find all the parent and child nodes of a given node in SQL
我见过很多使用CTE获取SQL中所有子节点(包括当前节点)的例子。简单示例如下:
;WITH #results AS
(
SELECT ChildId,
ParentId
FROM History
WHERE ChildId= @selected
UNION ALL
SELECT t.ChildId,
t.ParentId
FROM History t
INNER JOIN #results r ON r.ExpirationList = t.ParentId
)
SELECT *
FROM #results;
上面的查询为我提供了给定节点的所有子节点。例如:
A -> B -> C -> D -> E 并且我通过 @selected = "C",然后我得到结果 C -> D -> E.
我的问题是如何获得完整的链,而不管我传递的是什么。
如果@selected = "D",那么我希望结果为 A -> B -> C -> D -> E 和
如果@selected = "A",那么我希望结果为 A -> B -> C -> D -> E.
我想要给定节点的父节点和子节点。有人可以帮我查询吗?
这应该有效:
;WITH #results1 AS
(
SELECT ChildId,
ParentId
FROM History
WHERE ChildId= @selected
UNION ALL
SELECT t.ChildId,
t.ParentId
FROM History t
INNER JOIN #results1 r ON r.ExpirationList = t.ParentId
)
,#results2 AS
(
SELECT ChildId,
ParentId
FROM History
WHERE ChildId= @selected
UNION ALL
SELECT t.ChildId,
t.ParentId
FROM History t
INNER JOIN #results2 r ON t.ExpirationList = r.ParentId
)
SELECT *
FROM #results1
UNION
SELECT *
FROM #results2
我将 2 个 CTE(一个用于查找 child,另一个用于 parents)合并到公共临时文件 table 中,然后从中提取记录。
我参考了下面的代码项目 post 这很有帮助。
http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hierarchical-or-parent-child
感谢您的建议和回复。
我见过很多使用CTE获取SQL中所有子节点(包括当前节点)的例子。简单示例如下:
;WITH #results AS
(
SELECT ChildId,
ParentId
FROM History
WHERE ChildId= @selected
UNION ALL
SELECT t.ChildId,
t.ParentId
FROM History t
INNER JOIN #results r ON r.ExpirationList = t.ParentId
)
SELECT *
FROM #results;
上面的查询为我提供了给定节点的所有子节点。例如: A -> B -> C -> D -> E 并且我通过 @selected = "C",然后我得到结果 C -> D -> E.
我的问题是如何获得完整的链,而不管我传递的是什么。 如果@selected = "D",那么我希望结果为 A -> B -> C -> D -> E 和 如果@selected = "A",那么我希望结果为 A -> B -> C -> D -> E.
我想要给定节点的父节点和子节点。有人可以帮我查询吗?
这应该有效:
;WITH #results1 AS
(
SELECT ChildId,
ParentId
FROM History
WHERE ChildId= @selected
UNION ALL
SELECT t.ChildId,
t.ParentId
FROM History t
INNER JOIN #results1 r ON r.ExpirationList = t.ParentId
)
,#results2 AS
(
SELECT ChildId,
ParentId
FROM History
WHERE ChildId= @selected
UNION ALL
SELECT t.ChildId,
t.ParentId
FROM History t
INNER JOIN #results2 r ON t.ExpirationList = r.ParentId
)
SELECT *
FROM #results1
UNION
SELECT *
FROM #results2
我将 2 个 CTE(一个用于查找 child,另一个用于 parents)合并到公共临时文件 table 中,然后从中提取记录。
我参考了下面的代码项目 post 这很有帮助。 http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hierarchical-or-parent-child
感谢您的建议和回复。