簡體   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