Oracle層次查詢start with connect by


博客參考: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

記錄如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM