![](/img/trans.png)
[英]how to find the last level child nodes in tree kind structure in database using SQL
[英]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.