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

2021-04-17 20:00:36 字數 2761 閱讀 3717

資料表中遍歷尋找子節點的三種實現方法:示例問題如下:

表結構:

id parentid

1 0

2 1

3 2

針對該錶結構解釋如下:

1的父節點為0,

2的父節點為1,

3的父節點為2

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

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

下面的sql是在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

truncate 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

--頂層自身

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.parentid and

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

end

delete from #allrow where id = @id

select * from #allrow order by id

drop table #allrow     

實現方法三:

**如下:

在sql

server

2005中其實提供了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語句查詢的到該父結點下的所有子節點 下面的sq是在sql server下除錯通過的,如果是oracle,則有c...

鍊錶的三種實現

原題 頻繁的插入和刪除就用鍊錶,陣列可以實現隨機訪問,鍊錶不能 題解 方法一 陣列解法 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 就重複前面二步,否則排序...