程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> ORACLE遞歸查詢

ORACLE遞歸查詢

編輯:Oracle教程

ORACLE遞歸查詢


ORACLE支持常規的用CTE遞歸的方式實現遞歸查詢,也有自己特有的查詢方式,ORACLE文檔中叫層次數據查詢。

這裏通過一個簡單的例子來介紹這兩種查詢方式。

數據準備:

CREATE TABLE TBL_TEST( ID NUMBER,  NAME VARCHAR2(100),  PID NUMBER); 
/

BEGIN
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
END;	
 /

需求:ID = 1結點下所有的子結點(從表中數據可以看出是1、2、4、5)

ORACLE特有的遞歸查詢方式:

SELECT * FROM TBL_Test
START WITH ID = 1           -- 開始行(start row)
CONNECT BY PRIOR ID = pid;  -- prior代表上一行(parent row)
CTE方式:
WITH cte(ID,NAME,PID) AS
(
    SELECT ID,NAME,PID
    FROM TBL_TEST
    WHERE ID = 1
UNION ALL
    SELECT b.ID,b.NAME,b.PID
    FROM cte a
    INNER JOIN TBL_TEST b ON a.id = b.PID
)
SELECT * FROM cte;
以上兩種方法均查出了正確的結果。

上面第一種方法的Start With 相當於第二種方法的UNION ALL上面的部分,CONNECT BY 則相當於UNION ALL下面的部分。

CTE方法具有可移植性,SQL SERVER和DB2也支持。

關於CTE方法實現遞歸的更多實例,還可以看下面兩遍文章:

SQL遞歸查詢實戰

遞歸查詢初體驗

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved