查询指定节点及其所有子节点的方法

  1 /*
2 标题:SQL SERVER 2005中查询指定节点及其所有子节点的方法(表格形式显示)
3 作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
4 时间:2010-02-02
5 地点:新疆乌鲁木齐
6 */
7
8 create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
9 insert into tb values('001' , null , N'广东省')
10 insert into tb values('002' , '001' , N'广州市')
11 insert into tb values('003' , '001' , N'深圳市')
12 insert into tb values('004' , '002' , N'天河区')
13 insert into tb values('005' , '003' , N'罗湖区')
14 insert into tb values('006' , '003' , N'福田区')
15 insert into tb values('007' , '003' , N'宝安区')
16 insert into tb values('008' , '007' , N'西乡镇')
17 insert into tb values('009' , '007' , N'龙华镇')
18 insert into tb values('010' , '007' , N'松岗镇')
19 go
20
21 DECLARE @ID VARCHAR(3)
22
23 --查询ID = '001'的所有子节点
24 SET @ID = '001'
25 ;WITH T AS
26 (
27 SELECT ID , PID , NAME
28 FROM TB
29 WHERE ID = @ID
30 UNION ALL
31 SELECT A.ID , A.PID , A.NAME
32 FROM TB AS A JOIN T AS B ON A.PID = B.ID
33 )
34 SELECT * FROM T ORDER BY ID
35 /*
36 ID PID NAME
37 ---- ---- ----------
38 001 NULL 广东省
39 002 001 广州市
40 003 001 深圳市
41 004 002 天河区
42 005 003 罗湖区
43 006 003 福田区
44 007 003 宝安区
45 008 007 西乡镇
46 009 007 龙华镇
47 010 007 松岗镇
48
49 (10 行受影响)
50 */
51
52 --查询ID = '002'的所有子节点
53 SET @ID = '002'
54 ;WITH T AS
55 (
56 SELECT ID , PID , NAME
57 FROM TB
58 WHERE ID = @ID
59 UNION ALL
60 SELECT A.ID , A.PID , A.NAME
61 FROM TB AS A JOIN T AS B ON A.PID = B.ID
62 )
63 SELECT * FROM T ORDER BY ID
64 /*
65 ID PID NAME
66 ---- ---- ----------
67 002 001 广州市
68 004 002 天河区
69
70 (2 行受影响)
71 */
72
73 --查询ID = '003'的所有子节点
74 SET @ID = '003'
75 ;WITH T AS
76 (
77 SELECT ID , PID , NAME
78 FROM TB
79 WHERE ID = @ID
80 UNION ALL
81 SELECT A.ID , A.PID , A.NAME
82 FROM TB AS A JOIN T AS B ON A.PID = B.ID
83 )
84 SELECT * FROM T ORDER BY ID
85 /*
86 ID PID NAME
87 ---- ---- ----------
88 003 001 深圳市
89 005 003 罗湖区
90 006 003 福田区
91 007 003 宝安区
92 008 007 西乡镇
93 009 007 龙华镇
94 010 007 松岗镇
95
96 (7 行受影响)
97 */
98
99 drop table tb
100
101 --注:除ID值不一样外,三个SQL语句是一样的。
102
103
104
105 /*
106 标题:SQL SERVER 2005中查询指定节点及其所有子节点的方法(字符串形式显示)
107 作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
108 时间:2010-02-02
109 地点:新疆乌鲁木齐
110 */
111
112 create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
113 insert into tb values('001' , null , N'广东省')
114 insert into tb values('002' , '001' , N'广州市')
115 insert into tb values('003' , '001' , N'深圳市')
116 insert into tb values('004' , '002' , N'天河区')
117 insert into tb values('005' , '003' , N'罗湖区')
118 insert into tb values('006' , '003' , N'福田区')
119 insert into tb values('007' , '003' , N'宝安区')
120 insert into tb values('008' , '007' , N'西乡镇')
121 insert into tb values('009' , '007' , N'龙华镇')
122 insert into tb values('010' , '007' , N'松岗镇')
123 go
124
125 ;with t as
126 (
127 select id , cid = id from tb
128 union all
129 select t.id , cid = tb.id
130 from t join tb on tb.pid = t.cid
131 )
132 select id , cid = STUFF((SELECT ',' + rtrim(cid) FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , '')
133 from tb
134 group by id
135 order by id
136 /*
137 id cid
138 ---- ---------------------------------------
139 001 001,002,003,005,006,007,008,009,010,004
140 002 002,004
141 003 003,005,006,007,008,009,010
142 004 004
143 005 005
144 006 006
145 007 007,008,009,010
146 008 008
147 009 009
148 010 010
149
150 (10 行受影响)
151 */
152
153 ;with t as
154 (
155 select id , name , cid = id , path = cast(name as nvarchar(100)) from tb
156 union all
157 select t.id , t.name , cid = tb.id , path = cast(tb.name as nvarchar(100))
158 from t join tb on tb.pid = t.cid
159 )
160 select id , name ,
161 cid = STUFF((SELECT ',' + rtrim(cid) FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , ''),
162 path = STUFF((SELECT ',' + path FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , '')
163 from tb
164 group by id , name
165 order by id
166 /*
167 id name cid path
168 ---- ---------- ------------------------------------------- ---------------------------------------------------------------------
169 001 广东省 001,002,003,005,006,007,008,009,010,004 广东省,广州市,深圳市,罗湖区,福田区,宝安区,西乡镇,龙华镇,松岗镇,天河区
170 002 广州市 002,004 广州市,天河区
171 003 深圳市 003,005,006,007,008,009,010 深圳市,罗湖区,福田区,宝安区,西乡镇,龙华镇,松岗镇
172 004 天河区 004 天河区
173 005 罗湖区 005 罗湖区
174 006 福田区 006 福田区
175 007 宝安区 007,008,009,010 宝安区,西乡镇,龙华镇,松岗镇
176 008 西乡镇 008 西乡镇
177 009 龙华镇 009 龙华镇
178 010 松岗镇 010 松岗镇
179
180 (10 行受影响)
181 */
182
183 drop table tb
 
 
 
  1 /*
2 标题:SER SERVER 2000中统计各节点及其子节点的级别
3 作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
4 时间:2011-05-06
5 地点:重庆航天职业学院
6
7 id pid name
8 ---- ---- ----------
9 001 NULL 广东省
10 002 001 广州市
11 003 001 深圳市
12 004 002 天河区
13 005 003 罗湖区
14 006 003 福田区
15 007 003 宝安区
16 008 007 西乡镇
17 009 007 龙华镇
18 010 007 松岗镇
19 011 006 岗下镇
20 012 005 上沙镇
21 013 004 天河镇
22
23 -->统计结果如下:
24
25 ID PID NAME level
26 ---- ---- ---------- -----------
27 001 NULL 广东省 1
28 002 001 广州市 2
29 003 001 深圳市 2
30 004 002 天河区 3
31 005 003 罗湖区 3
32 006 003 福田区 3
33 007 003 宝安区 3
34 008 007 西乡镇 4
35 009 007 龙华镇 4
36 010 007 松岗镇 4
37 011 006 岗下镇 4
38 012 005 上沙镇 4
39 013 004 天河镇 4
40 */
41
42 create table tb(id varchar(3) , pid varchar(3) , name varchar(10))
43 insert into tb values('001' , null , '广东省')
44 insert into tb values('002' , '001' , '广州市')
45 insert into tb values('003' , '001' , '深圳市')
46 insert into tb values('004' , '002' , '天河区')
47 insert into tb values('005' , '003' , '罗湖区')
48 insert into tb values('006' , '003' , '福田区')
49 insert into tb values('007' , '003' , '宝安区')
50 insert into tb values('008' , '007' , '西乡镇')
51 insert into tb values('009' , '007' , '龙华镇')
52 insert into tb values('010' , '007' , '松岗镇')
53 insert into tb values('011' , '006' , '岗下镇')
54 insert into tb values('012' , '005' , '上沙镇')
55 insert into tb values('013' , '004' , '天河镇')
56 go
57
58 create function f_getlevel(@id varchar(3)) returns int
59 as
60 begin
61 declare @re_str as varchar(3)
62 set @re_str = ''
63 declare @level as int
64 set @level = 1
65 select @re_str = pid from tb where id = @id
66 while exists (select 1 from tb where id = @re_str)
67 begin
68 select @re_str = pid from tb where id = @re_str
69 set @level = @level + 1
70 end
71 return @level
72 end
73 go
74
75 select * , dbo.f_getlevel(id) level from tb
76
77 drop function dbo.f_getlevel
78 drop table tb
79
80 /*--------------------------------------------------------------------------------------------
81
82 ---------------------------------------------------------------------------------------------*/
83
84 /*
85 标题:SER SERVER 2005中统计各节点及其子节点的级别
86 作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
87 时间:2011-05-06
88 地点:重庆航天职业学院
89
90 id pid name
91 ---- ---- ----------
92 001 NULL 广东省
93 002 001 广州市
94 003 001 深圳市
95 004 002 天河区
96 005 003 罗湖区
97 006 003 福田区
98 007 003 宝安区
99 008 007 西乡镇
100 009 007 龙华镇
101 010 007 松岗镇
102 011 006 岗下镇
103 012 005 上沙镇
104 013 004 天河镇
105
106 -->统计结果如下:
107
108 ID PID NAME level
109 ---- ---- ---------- -----------
110 001 NULL 广东省 1
111 002 001 广州市 2
112 003 001 深圳市 2
113 004 002 天河区 3
114 005 003 罗湖区 3
115 006 003 福田区 3
116 007 003 宝安区 3
117 008 007 西乡镇 4
118 009 007 龙华镇 4
119 010 007 松岗镇 4
120 011 006 岗下镇 4
121 012 005 上沙镇 4
122 013 004 天河镇 4
123 */
124
125 create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
126 insert into tb values('001' , null , N'广东省')
127 insert into tb values('002' , '001' , N'广州市')
128 insert into tb values('003' , '001' , N'深圳市')
129 insert into tb values('004' , '002' , N'天河区')
130 insert into tb values('005' , '003' , N'罗湖区')
131 insert into tb values('006' , '003' , N'福田区')
132 insert into tb values('007' , '003' , N'宝安区')
133 insert into tb values('008' , '007' , N'西乡镇')
134 insert into tb values('009' , '007' , N'龙华镇')
135 insert into tb values('010' , '007' , N'松岗镇')
136 insert into tb values('011' , '006' , N'岗下镇')
137 insert into tb values('012' , '005' , N'上沙镇')
138 insert into tb values('013' , '004' , N'天河镇')
139 go
140
141 ;WITH T AS
142 (
143 SELECT ID , PID , NAME , level = 1 FROM TB where pid is null
144 UNION ALL
145 SELECT B.ID , B.PID , B.NAME , A.level + 1 FROM t A JOIN tb AS B ON A.id = B.pID
146 )
147 select * from t order by id
148
149 drop table tb


 

原文地址:https://www.cnblogs.com/lilwzca/p/2253030.html