資料表中遍歷尋找子節點的三種實現方法:示例問題如下:
表結構:
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 就重複前面二步,否則排序...