繁体   English   中英

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

[英]How to know if a child exists on any nest level in a tree structure

我有一个树形表,如下所示:

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 IsATreeChild @ParentID应该返回true。 我只是不明白该怎么做。

有什么建议么?

递归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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM