我有一张树桌,显示:
TREE (TreeID int PK, ParentID int)
我想要弄清楚的是,如果我选择一个Tree项,如何知道该子项是否存在于其父项的任何子级别中,如果它是一个函数,我会认为它看起来像这样?
@ParentID --@param, The TreeID of the Tree item in focus
SELECT TreeID
FROM TREE
WHERE dbo.IsATreeChild(TreeID,@ParentID) = 1
基本上,如果TreeId
的{{1}} IsATreeChild
它应该返回true。我无法理解如何做到这一点。
有什么建议吗?
答案 0 :(得分:2)
递归CTE是树木处理的常见帮手。
您可能会发现以下有用功能:
create function dbo.ftTreeNodeChildren(@treeID int)
RETURNS TABLE
AS RETURN
with Children(TreeID) as (
select TreeID
from Tree
where ParentID = @treeID
union all
select T.TreeID
from Children C
join Tree T on T.ParentID = C.TreeID
)
select TreeID
from Children
GO
它可以用作:
select TreeID
from dbo.ftTreeNodeChildren(@treeID)
应该列出@treeID
的孩子(如果有的话)。
有时包含@treeID
本身会很有用。在这种情况下,可以使用类似的功能:
create function dbo.ftTreeNodeSubtree(@treeID int)
RETURNS TABLE
AS RETURN
with Subtree(TreeID) as (
select TreeID
from Tree
where TreeID = @treeID
union all
select T.TreeID
from Subtree S
join Tree T on T.ParentID = S.TreeID
)
select TreeID
from Subtree
GO
应列出儿童或@treeID
(如果有的话),包括@treeID
本身。
upd。:要检查@treeID
是否为@parentID
的任何级别的孩子,您可以使用第一个函数:
if exists (
select 1
from dbo.ftTreeNodeChildren(@parentID)
where TreeID = @treeID
)
print '@treeID is a child of @parentID'
else
print '@treeID is NOT a child of @parentID'