三種實現方法實現資料表中遍歷尋找子節點

2022-09-25 07:15:13 字數 2737 閱讀 8779

示例問題如下: 

表結構:  

id parentid 

1 0 

2 1 

3 2 

......  

針對該錶結構解釋如下: 

1的父節點為0, 

2的父節點為1, 

3的父節點為2 

...... 

以此類推,要求給定乙個父節點的值,比如1, 

用sql語句查詢的到該父結點下的所有子節點 

下面的sq是在sql server下除錯通過的,如果是oracle,則有connect by可以實現. 

建立測試表: 

drop table dbtree 

create table dbtree 

(  [id] int, 

[name] nvarchar(20), 

[parentid] int 

)   

插入測試資料: 

insert into dbtree ([id],[parentid]) values (1,0) 

insert into dbtree ([id],[parentid]) values (2,1) 

insert into dbtree ([id],[parentid]) values (3,1) 

insert into dbtree ([id],[parentid]) values (4,3) 

insert into dbtree ([id],[parentid]) values (5,4) 

insert into dbtree ([id],[parentid]) values (6,7) 

insert into dbtree ([id],[parentid]) values (8,5) 

實現方法一: 

**如下: 

declare @id int 

set @id = 1 ---在次修改父節點 

select * into #temp from dbtree where parentid in (@id) 

select * into #allrow from dbtree where parentid in (@id) --1,2 

while exists(select * from #temp) 

begin 

select * into #temp2 from #temp 

truncwww.cppcns.comate table #temp 

insert into #temp select * from dbtree where parentid in (select id from #temp2) 

insert into #allrow select * from #temp 

drop table #temp2 

end 

select * from #allrow order by id 

drop table #temp 

drop table #allrow 

實現方法二: 

**如下: 

create table #allrow 

(  id int, 

parentid int 

)  declare @id int 

set @id = 1 ---在次修改父節點 

delete #allrow&ndojtlqvbsp;

--頂層自身 

insert into #allrow (id,parentid) select @id, @id 

while @@rowcount > 0 

begin 

insert into #allrow (id,parentid) 

select b.id,a.id 

from #allrow a,dbtree b 

where a.id = b.parenti程式設計客棧d and 

not exists (select id from #allrow where id = b.id and parentid = a.id) 

end 

delete from #allrow where id = @id 

select *&n #allrow order by id 

drop table #allrow 

實現方法三: 

**如下: 

在sql server2005中其實提供了cte[公共表表示式]來實現遞迴: 

關於cte的使用請查msdn 

declare @id int 

set @id = 3; ---在次修改父節點 

with rootnodecte(id,parentid) 

as 

(  select id,parentid from dbtree where parentid in (@id) 

union all 

select dbtree.id,dbtree.parentid from rootnodecte 

inner join dbtree 

on rootnodecte.id = dbtree.parentid 

)  select * from rootnodecte 

本文標題: 三種實現方法實現資料表中遍歷尋找子節點

本文位址:

三種實現方法實現資料表中遍歷尋找子節點

資料表中遍歷尋找子節點的三種實現方法 示例問題如下 表結構 id parentid 1 0 2 1 3 2 針對該錶結構解釋如下 1的父節點為0,2的父節點為1,3的父節點為2 以此類推,要求給定乙個父節點的值,比如1,用sql語句查詢的到該父結點下的所有子節點 下面的sql是在sql server...

鍊錶的三種實現

原題 頻繁的插入和刪除就用鍊錶,陣列可以實現隨機訪問,鍊錶不能 題解 方法一 陣列解法 includeusing namespace std int n,a,b,k,v 100000 struct studentd 100000 int main else cin n for int i 1 i n...

氣泡排序三種實現方法

氣泡排序是非常容易理解和實現,以從小到大排序舉例 設陣列長度為n。1 比較相鄰的前後二個資料,如果前面資料大於後面的資料,就將二個資料交換。2 這樣對陣列的第 0個資料到 n 1個資料進行一次遍歷後,最大的乙個資料就 沉 到陣列第 n 1個位置。3 n n 1 如果n不為0 就重複前面二步,否則排序...