首页 > 代码库 > 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遞歸查詢實戰
遞歸查詢初體驗
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。