一、創建樹結構的數據庫表
-- 數據庫爲 SQL Server
create table treeTest(
id int,
parentId int,
info varchar(10)
)
-- 插入數據
insert into treeTest(id,parentId,info) values(1,null,'root');
insert into treeTest(id,parentId,info) values(2,1,'two');
insert into treeTest(id,parentId,info) values(3,1,'three');
insert into treeTest(id,parentId,info) values(7,2,'seven');
insert into treeTest(id,parentId,info) values(8,2,'eight');
insert into treeTest(id,parentId,info) values(9,2,'nine');
insert into treeTest(id,parentId,info) values(4,3,'four');
insert into treeTest(id,parentId,info) values(5,3,'five');
insert into treeTest(id,parentId,info) values(6,3,'six');
insert into treeTest(id,parentId,info) values(14,7,'fourteen');
insert into treeTest(id,parentId,info) values(15,7,'fifteen');
insert into treeTest(id,parentId,info) values(16,8,'sixteen');
insert into treeTest(id,parentId,info) values(17,9,'seventeen');
insert into treeTest(id,parentId,info) values(10,4,'ten');
insert into treeTest(id,parentId,info) values(11,5,'eleven');
insert into treeTest(id,parentId,info) values(12,5,'twelve');
insert into treeTest(id,parentId,info) values(13,6,'thirteen');
二、通用的 SQL 遍歷方法
在 SQL 語句中使用 with as 語句,詳細介紹參考:
SQL中使用WITH AS提高性能-使用公用表表達式(CTE)簡化嵌套SQL
-- 遍歷節點id爲3的所有子節點
-- 小括號中的參數需與查詢表中的字段個數一致,即兩個 select 關鍵字後的字段個數,有些數據庫不允許第2個select關鍵字後用*號表示所有字段,如oracle
-- temp.id = t.parentId 沒有順序要求,如果改爲 temp.parentId = t.id 則語句向上遍歷所有祖先節點
with temp(id,parentId,info)
as
(
select * from treeTest
where id = 3
union all
select t.* from treeTest t,temp
where temp.id = t.parentId
) select * from temp
返回結果:
三、Oracle 特有的樹遍歷方法
-- 從id=5的節點開始,向下遍歷所有子孫節點
-- prior 關鍵字可放在 treeTest.id 或 treeTest.parentId 的前面,決定遍歷的方向
select * from treeTest
start with treeTest.id=5
connect by prior treeTest.id = treeTest.parentId