SQL語句遍歷樹結構的數據表

一、創建樹結構的數據庫表

-- 數據庫爲 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
發佈了66 篇原創文章 · 獲贊 37 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章