SQL SERVER 2005中查询指定节点及其所有父节点的方法

create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
insert into tb values('001' , null  , N'广东省')
insert into tb values('002' , '001' , N'广州市')
insert into tb values('003' , '001' , N'深圳市')
insert into tb values('004' , '002' , N'天河区')
insert into tb values('005' , '003' , N'罗湖区')
insert into tb values('006' , '003' , N'福田区')
insert into tb values('007' , '003' , N'宝安区')
insert into tb values('008' , '007' , N'西乡镇')
insert into tb values('009' , '007' , N'龙华镇')
insert into tb values('010' , '007' , N'松岗镇')
go

DECLARE @ID VARCHAR(3)

--查询ID = '001'的所有父节点
SET @ID = '001'
;
WITH T AS
(
 
SELECT ID , PID , NAME
 
FROM TB
 
WHERE ID = @ID
 
UNION ALL
 
SELECT A.ID , A.PID , A.NAME
 
FROM TB AS A JOIN T AS B ON A.ID = B.PID
)
SELECT * FROM T ORDER BY ID
/*
ID   PID  NAME
---- ---- ----------
001  NULL 广东省

(1 行受影响)
*/

--查询ID = '002'的所有父节点
SET @ID = '002'
;
WITH T AS
(
 
SELECT ID , PID , NAME
 
FROM TB
 
WHERE ID = @ID
 
UNION ALL
 
SELECT A.ID , A.PID , A.NAME
 
FROM TB AS A JOIN T AS B ON A.ID = B.PID
)
SELECT * FROM T ORDER BY ID
/*
ID   PID  NAME
---- ---- ----------
001  NULL 广东省
002  001  广州市

(2 行受影响)
*/

--查询ID = '003'的所有父节点
SET @ID = '003'
;
WITH T AS
(
 
SELECT ID , PID , NAME
 
FROM TB
 
WHERE ID = @ID
 
UNION ALL
 
SELECT A.ID , A.PID , A.NAME
 
FROM TB AS A JOIN T AS B ON A.ID = B.PID
)
SELECT * FROM T ORDER BY ID
/*
ID   PID  NAME
---- ---- ----------
001  NULL 广东省
003  001  深圳市

(2 行受影响)
*/

--查询ID = '009'的所有父节点
SET @ID = '009'
;
WITH T AS
(
 
SELECT ID , PID , NAME
 
FROM TB
 
WHERE ID = @ID
 
UNION ALL
 
SELECT A.ID , A.PID , A.NAME
 
FROM TB AS A JOIN T AS B ON A.ID = B.PID
)
SELECT * FROM T ORDER BY ID
/*
ID   PID  NAME
---- ---- ----------
001  NULL 广东省
003  001  深圳市
007  003  宝安区
009  007  龙华镇

(4 行受影响)
*/

drop table tb

--注:除ID值不一样外,四个SQL语句是一样的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值