SQLSERVER 樹級遞迴查詢

2021-10-04 03:20:17 字數 1884 閱讀 2516

根據父id 查詢所有子節點

-- with乙個臨時表(括號中是你要查詢的列名)

with temp(subject_id,parent_id,name,curlevel)as

(--1:初始查詢(這裡的pid=-1 在我的資料中是最底層的根節點)

select subject_id,parent_id,name,1 as level from subject

where parent_id = 1 -- 注意這裡

union all

--2:遞迴條件

select a.subject_id,a.parent_id,a.name, b.curlevel+1 from subject a --3:這裡的臨時表和原始資料表都必須使用別名,不然遞迴的時候不知道查詢的是那個表的列

inner join

temp b

on ( a.parent_id=b.subject_id) --這個關聯關係很重要,一定要理解一下誰是誰的父節點

)select * from temp --4:遞迴完成後 一定不要少了這句查詢語句 否則會報錯

根據id查詢所有父節點

-- with乙個臨時表(括號中是你要查詢的列名)

with temp(org_id,parent_id,org_name,curlevel)as

(-- 1:初始查詢(這裡的pid=-1 在我的資料中是最底層的根節點)

select org_id,parent_id,org_name,1 as level from organization

where org_id = 10101 -- 注意這裡

union all

-- 2:遞迴條件

select a.org_id,a.parent_id,a.org_name, b.curlevel+1 from organization a

-- 3:這裡的臨時表和原始資料表都必須使用別名,不然遞迴的時候不知道查詢的是那個表的列

inner join

temp b

on ( b.parent_id=a.org_id) -- 這個關聯關係很重要,一定要理解一下誰是誰的父節點

)select * from temp -- 4:遞迴完成後 一定不要少了這句查詢語句 否則會報錯

查詢給定節點的所有父級節點和子節點

with tail(org_id,parent_id,org_name)as

(select org_id,parent_id,org_name from organization

where parent_id = 10101

union all

select a.org_id,a.parent_id,a.org_name from organization a

inner join

tail b

on ( a.parent_id=b.org_id)

),head(org_id,parent_id,org_name)as

(select org_id,parent_id,org_name from organization

where org_id = 10101

union all

select a.org_id,a.parent_id,a.org_name from organization a

inner join

head b

on ( b.parent_id=a.org_id)

)select * from head

union

select * from tail

SQLServer 遞迴查詢

感謝文章遞迴查詢,正好趁此機會梳理一下資料庫的遞迴查詢 公用表表示式 cte 可以認為是在單個 select insert update delete 或 create view 語句的執行範圍內定義的臨時結果集。公用表表示式可以包括對自身的引用,這種表示式稱為遞迴公用表表示式。with expre...

sqlserver 遞迴查詢

有如下資料表 假如我們要查詢id為003的資料的所有子節點我們可以使用cte 遞迴查詢完成.sql view plain copy print?if object id tb n is notnull drop table tb create table tb id varchar 3 pid va...

sql server遞迴查詢

1 既然要談到sql,資料庫表是必須的 2 資料結構 3 獲取某個節點的所有子節點 傳統的寫法 sql2000 很麻煩,暫且就不寫了 來看看cte的寫法 create proc sp gettreebyid treeid int asbegin with ctetree as select from...