日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

SQL Tree解法

發(fā)布時(shí)間:2023/12/10 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Tree解法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
create table tb(id varchar(3) , pid varchar(3) , name varchar(10)) insert into tb values('001' , null , '廣東省') insert into tb values('002' , '001' , '廣州市') insert into tb values('003' , '001' , '深圳市') insert into tb values('004' , '002' , '天河區(qū)') insert into tb values('005' , '003' , '羅湖區(qū)') insert into tb values('006' , '003' , '福田區(qū)') insert into tb values('007' , '003' , '寶安區(qū)') insert into tb values('008' , '007' , '西鄉(xiāng)鎮(zhèn)') insert into tb values('009' , '007' , '龍華鎮(zhèn)') insert into tb values('010' , '007' , '松崗鎮(zhèn)') go--查詢各節(jié)點(diǎn)的父路徑函數(shù)(從父到子) create function f_pid1(@id varchar(3)) returns varchar(100) as begindeclare @re_str as varchar(100)set @re_str = ''select @re_str = name from tb where id = @idwhile exists (select 1 from tb where id = @id and pid is not null)beginselect @id = b.id , @re_str = b.name + ',' + @re_str from tb a , tb b where a.id = @id and a.pid = b.idendreturn @re_str end go --查詢各節(jié)點(diǎn)的父路徑函數(shù)(從子到父) create function f_pid2(@id varchar(3)) returns varchar(100) as begindeclare @re_str as varchar(100)set @re_str = ''select @re_str = name from tb where id = @idwhile exists (select 1 from tb where id = @id and pid is not null)beginselect @id = b.id , @re_str = @re_str + ',' + b.name from tb a , tb b where a.id = @id and a.pid = b.idendreturn @re_str end goselect * , dbo.f_pid1(id) [路徑(從父到子)] ,dbo.f_pid2(id) [路徑(從子到父)] from tb order by iddrop function f_pid1 , f_pid2 drop table tb/* id pid name 路徑(從父到子) 路徑(從子到父) ---- ---- ------ --------------------------- ---------------------------- 001 NULL 廣東省 廣東省 廣東省 002 001 廣州市 廣東省,廣州市 廣州市,廣東省 003 001 深圳市 廣東省,深圳市 深圳市,廣東省 004 002 天河區(qū) 廣東省,廣州市,天河區(qū) 天河區(qū),廣州市,廣東省 005 003 羅湖區(qū) 廣東省,深圳市,羅湖區(qū) 羅湖區(qū),深圳市,廣東省 006 003 福田區(qū) 廣東省,深圳市,福田區(qū) 福田區(qū),深圳市,廣東省 007 003 寶安區(qū) 廣東省,深圳市,寶安區(qū) 寶安區(qū),深圳市,廣東省 008 007 西鄉(xiāng)鎮(zhèn) 廣東省,深圳市,寶安區(qū),西鄉(xiāng)鎮(zhèn) 西鄉(xiāng)鎮(zhèn),寶安區(qū),深圳市,廣東省 009 007 龍華鎮(zhèn) 廣東省,深圳市,寶安區(qū),龍華鎮(zhèn) 龍華鎮(zhèn),寶安區(qū),深圳市,廣東省 010 007 松崗鎮(zhèn) 廣東省,深圳市,寶安區(qū),松崗鎮(zhèn) 松崗鎮(zhèn),寶安區(qū),深圳市,廣東省(所影響的行數(shù)為 10 行) */ /* 標(biāo)題:SQL SERVER 2005中查詢指定節(jié)點(diǎn)及其所有父節(jié)點(diǎn)的方法(字符串形式顯示) 作者:愛(ài)新覺(jué)羅·毓華(十八年風(fēng)雨,守得冰山雪蓮花開(kāi)) 時(shí)間:2010-02-02 地點(diǎn):新疆烏魯木齊 */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'天河區(qū)') insert into tb values('005' , '003' , N'羅湖區(qū)') insert into tb values('006' , '003' , N'福田區(qū)') insert into tb values('007' , '003' , N'寶安區(qū)') insert into tb values('008' , '007' , N'西鄉(xiāng)鎮(zhèn)') insert into tb values('009' , '007' , N'龍華鎮(zhèn)') insert into tb values('010' , '007' , N'松崗鎮(zhèn)') go;with t as (select id , pid = id from tb union allselect t.id , pid = tb.pid from t inner join tb on t.pid = tb.id ) select id , [路徑(從父到子)] = STUFF((SELECT ',' + pid FROM t WHERE id = tb.id order by t.id , t.pid FOR XML PATH('')) , 1 , 1 , ''),[路徑(從子到父)] = STUFF((SELECT ',' + pid FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , '') from tb group by id order by id /* id 路徑(從父到子) 路徑(從子到父) ---- --------------- --------------- 001 001 001 002 001,002 002,001 003 001,003 003,001 004 001,002,004 004,002,001 005 001,003,005 005,003,001 006 001,003,006 006,003,001 007 001,003,007 007,003,001 008 001,003,007,008 008,007,003,001 009 001,003,007,009 009,007,003,001 010 001,003,007,010 010,007,003,001(10 行受影響) */;with t as (select id , name , pid = id , path = cast(name as nvarchar(100)) from tb union allselect t.id , t.name , pid = tb.pid , path = cast(tb.name as nvarchar(100)) from t join tb on tb.id = t.pid ) select id , name ,[路徑(從父到子)_1] = pid1, [路徑(從父到子)_2] = reverse(substring(reverse(path1) , charindex(',' , reverse(path1)) + 1 , len(path1))) ,[路徑(從子到父)_1] = pid2,[路徑(從子到父)_2] = substring(path2 , charindex(',' , path2) + 1 , len(path2)) from ( select id , name ,pid1 = STUFF((SELECT ',' + pid FROM t WHERE id = tb.id order by t.id , t.pid FOR XML PATH('')) , 1 , 1 , ''),pid2 = STUFF((SELECT ',' + pid FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , ''),path1 = STUFF((SELECT ',' + path FROM t WHERE id = tb.id order by t.id , t.pid FOR XML PATH('')) , 1 , 1 , ''),path2 = STUFF((SELECT ',' + path FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , '') from tb group by id , name ) m order by id /* id name 路徑(從父到子)_1 路徑(從父到子)_2 路徑(從子到父)_1 路徑(從子到父)_2 ---- ------ ---------------- --------------------------- ---------------- --------------------------- 001 廣東省 001 廣東省 001 廣東省 002 廣州市 001,002 廣東省,廣州市 002,001 廣州市,廣東省 003 深圳市 001,003 廣東省,深圳市 003,001 深圳市,廣東省 004 天河區(qū) 001,002,004 廣東省,廣州市,天河區(qū) 004,002,001 天河區(qū),廣州市,廣東省 005 羅湖區(qū) 001,003,005 廣東省,深圳市,羅湖區(qū) 005,003,001 羅湖區(qū),深圳市,廣東省 006 福田區(qū) 001,003,006 廣東省,深圳市,福田區(qū) 006,003,001 福田區(qū),深圳市,廣東省 007 寶安區(qū) 001,003,007 廣東省,深圳市,寶安區(qū) 007,003,001 寶安區(qū),深圳市,廣東省 008 西鄉(xiāng)鎮(zhèn) 001,003,007,008 廣東省,深圳市,寶安區(qū),西鄉(xiāng)鎮(zhèn) 008,007,003,001 西鄉(xiāng)鎮(zhèn),寶安區(qū),深圳市,廣東省 009 龍華鎮(zhèn) 001,003,007,009 廣東省,深圳市,寶安區(qū),龍華鎮(zhèn) 009,007,003,001 龍華鎮(zhèn),寶安區(qū),深圳市,廣東省 010 松崗鎮(zhèn) 001,003,007,010 廣東省,深圳市,寶安區(qū),松崗鎮(zhèn) 010,007,003,001 松崗鎮(zhèn),寶安區(qū),深圳市,廣東省(10 行受影響) */drop table tb

轉(zhuǎn)載于:https://www.cnblogs.com/LCX/archive/2011/03/12/1982036.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的SQL Tree解法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。