如何知道子树是否存在于树结构中的任何嵌套级别

时间:2013-12-27 21:04:47

标签: sql sql-server sql-server-2008 tsql

我有一张树桌,显示:

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。我无法理解如何做到这一点。

有什么建议吗?

1 个答案:

答案 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'