博客參考:https://www.cnblogs.com/jerryxing/articles/2339352.html
start with connect by 層次查詢(Hierarchical Queries)
語法:
SELECT *
FROM table
START WITH ID = 1
CONNECT BY PRIOR PID = ID
start with: 表示根記錄的條件
connect by: 指定了父記錄行和子記錄行之間的關系,在層次查詢中,條件表達式必須使用prior操作符來指定父記錄行
如:
CONNECT BY PRIOR pid = id 或者CONNECT BY pid = PRIOR id
如果connect by 條件是一個組合條件,那么只有一個條件需要prior操作符,
如:
CONNECT BY last_name != 'King' AND PRIOR employee_id = manager_id
不過,connect by 不能包含子查詢。
prior是一個二元操作符,最常見的是用於列值相等的比較,它讓Oracle使用對應列的父親行的值。使用非相等比較,極有可能倒致查詢陷入無窮循環,以出錯終止。
Start with...Connect By子句遞歸查詢一般用於一個表維護樹形結構的應用。可以通過一個簡單的例子來理解其使用的概念和方法。
創建表示例:
CREATE TABLE tbl_test ( ID NUMBER, NAME VARCHAR2(10), pid NUMBER DEFAULT 0 ); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','111','0'); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','222','1'); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','333','0'); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','444','1'); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','555','2'); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('6','666','0'); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('9','999','2');
查詢表數據:
從父記錄行向子記錄行遞歸
select * from TBL_TEST start with id=1 connect by prior id=pid
根節點為id=1
connect by prior id=pid 由id和pid建立父子關系,id=1開始,在pid尋找等於1的值,可以找到2和4,在pid=2,4 中找,找到id有5和9倆個。
從子記錄向父記錄遞歸
select * from TBL_TEST start with id=5 connect by prior pid=id
根節點為id=5
connect by prior pid=id id=5時,找pid為2,在找id=2的行,找到pid=1,再找id=1的行
LEVEL,ROW_NUMBER,OVER的應用
SELECT LEVEL, pid, ROW_NUMBER () OVER (PARTITION BY pid ORDER BY pid) by_pid, ROW_NUMBER () OVER (ORDER BY pid) AS rn, NAME FROM tbl_test START WITH pid = 0 CONNECT BY PRIOR ID = pid ORDER BY 1
記錄如下: