遍历树--得到某个节点下所有的最底层的节点数据

有一个表名为:T
结构如下:
id ---int
parentid---int 上层的父节点
sname--varchar(50)

如有以下数据:
id  parentid  sname
1  -1         根节点
2   1         节点1
3   1         节点2
4   2         节点3
5   2         节点4
6   3         节点5
7   3         节点6
7   6         节点7

假如:我要得到某个节点下所有的最底层的节点数据怎么实现:
如:我要得到id=3 的所有最底层的数据是:
id  parentid   sname
7   3          节点6
7   6          节点

 

create table tb(id int, parentid int, sname varchar(10))
insert into tb values(1 , -1 ,        '根节点')
insert into tb values(21 ,        '节点1')
insert into tb values(31 ,        '节点2')
insert into tb values(42 ,        '节点3')
insert into tb values(52 ,        '节点4')
insert into tb values(63 ,        '节点5')
insert into tb values(73 ,        '节点6')
insert into tb values(76 ,        '节点7')
go

--查询指定节点及其所有子节点的函数
CREATE FUNCTION f_Cid(@ID int) RETURNS @t_Level TABLE(ID int,Level int)
AS
BEGIN
 
DECLARE @Level int
 
SET @Level=1
 
INSERT @t_Level SELECT @ID,@Level
 
WHILE @@ROWCOUNT>0
 
BEGIN
   
SET @Level=@Level+1
   
INSERT @t_Level SELECT a.ID,@Level
   
FROM tb a,@t_Level b
   
WHERE a.parentid=b.ID
   
AND b.Level=@Level-1
 
END
 
RETURN
END
GO

SELECT distinct a.* FROM tb a,f_Cid(3) b WHERE a.ID=b.ID and a.id not in(select parentid from tb)

drop table tb
drop function dbo.f_cid

/*
id          parentid    sname     
----------- ----------- ----------
7           3           节点6
7           6           节点7

(所影响的行数为 2 行)
*/

-- sql 2005 可以直接查询

;WITH
TREE
AS(
   
SELECT * FROM TWHERE parentid = 3  -- 要查询的父 id
    UNION ALL
   
SELECT T * FROM T, TREE
   
WHERE T.parentid = TREE.id
)
SELECT * FROM TREE

你可能感兴趣的:(SQL字符串处理)