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 查
查 初