我已经看到许多使用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.
我想要给定节点的父节点和子节点。有人可以帮我查询一下吗?
答案 0 :(得分:0)
这应该有效:
;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
答案 1 :(得分:0)
我将2个CTE(一个用于查找子项,另一个用于父项)组合到公共临时表中,然后从中删除记录。
我参考了下面的codeproject帖子,它很有帮助。 http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hierarchical-or-parent-child
感谢您的建议和回复。