SQL查询子节点或父节点

查询指定节点及其所有子节点或父节点

 

****************************查询开始******************************
--
SQL2005 使用CTE
DECLARE @ VARCHAR(10)
SET @='栾川县'
;
WITH XiaoAi AS
(
SELECT id FROM tb WHERE [name]=@
UNION ALL
SELECT t.id FROM XiaoAi AS a INNER JOIN tb AS t ON a.id=t.pid
)
SELECT t.* FROM XiaoAi AS a LEFT JOIN tb AS t ON t.id=a.id

--SQL 2000 使用函数
IF OBJECT_ID('dbo.XiaoAi') IS NOT NULL DROP FUNCTION dbo.XiaoAi
GO
CREATE FUNCTION dbo.XiaoAi(@ VARCHAR(20))
RETURNS @t TABLE(id VARCHAR(3), pid VARCHAR(3), [name] VARCHAR(20),Level INT)
AS
BEGIN
   
DECLARE @level INT
   
SET @level=1
   
INSERT INTO @t SELECT *,@level FROM tb WHERE [name]=@
   
WHILE(@@ROWCOUNT>0)
       
BEGIN
           
SET @level=@level+1
           
INSERT INTO @t SELECT t.*,@level FROM tb AS t,@t AS a WHERE a.id=t.pid AND a.level=@level-1
       
END
RETURN
END
GO
--调用函数
SELECT id, pid,[name]  from dbo.XiaoAi('栾川县')
--****************************查询结束*************************************
/*

2、查询指定节点及其所有父节点
如:已知 栾川县
得到以下结果
id   pid  name
---- ---- ----------
001  NULL 河南省
002  001  洛阳市
004  002  栾川县
*/
----------------------测试开始-------------------------------------------------
DECLARE @s VARCHAR(10)
SET @s='栾川县'
SELECT id, pid,[name] INTO # FROM tb WHERE [name]=@s
WHILE @@ROWCOUNT>0
   
BEGIN
   
INSERT INTO # SELECT t.id, t.pid,t.[name] FROM tb AS t
                               
INNER JOIN # AS a ON t.id=a.pid AND t.id NOT IN(SELECT ID FROM #)
   
END
SELECT * FROM # ORDER BY ID
-----------------------测试结束-------------------------------------------------

IF OBJECT_ID ( ' tb ' ) IS NOT NULL DROP TABLE tb
GO
CREATE TABLE tb(id VARCHAR ( 3 ),pid VARCHAR ( 3 ), [ name ] VARCHAR ( 10 ))
GO
INSERT INTO tb SELECT ' 001 ' , NULL , ' 河南省 '
UNION ALL SELECT ' 002 ' , ' 001 ' , ' 洛阳市 '
UNION ALL SELECT ' 003 ' , ' 001 ' , ' 新乡市 '
UNION ALL SELECT ' 004 ' , ' 002 ' , ' 栾川县 '
UNION ALL SELECT ' 005 ' , ' 003 ' , ' 长垣县 '
UNION ALL SELECT ' 006 ' , ' 002 ' , ' 孟津县 '
UNION ALL SELECT ' 007 ' , ' 004 ' , ' 冷水乡 '
UNION ALL SELECT ' 008 ' , ' 004 ' , ' 叫河乡 '
UNION ALL SELECT ' 009 ' , ' 008 ' , ' A村 '
UNION ALL SELECT ' 010 ' , ' 008 ' , ' B村 '
GO
/*
1、查询指定节点及其所有子节点
--如:已知 栾川县
--得到结果

id   pid  name
---- ---- ----------
004  002  栾川县
007  004  冷水乡
008  004  叫河乡
009  008  A村
010  008  B村
*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值