一.在Oracle中可使用Start with...Connect By子句
Start with...Connect By子句遞歸查詢一般用於一個表維護樹形結構的應用。
創建示例表:
CREATE TABLE TBL_TEST ( ID NUMBER, NAME VARCHAR2(100 BYTE), PID NUMBER DEFAULT 0 );
插入測試數據:
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');
從Root往樹末梢遞歸
select * from TBL_TEST start with id=1 connect by prior id = pid
從末梢往樹ROOT遞歸
select * from TBL_TEST start with id=5 connect by prior pid = id
二.寫一個函數,調用函數查詢
二.寫一個函數,調用函數查詢
--測試數據
CREATETABLE tb(ID char(3),PID char(3),Name nvarchar(10))
INSERT tb SELECT'001',NULL ,'山東省'
UNIONALLSELECT'002','001','煙台市'
UNIONALLSELECT'004','002','招遠市'
UNIONALLSELECT'003','001','青島市'
UNIONALLSELECT'005',NULL ,'四會市'
UNIONALLSELECT'006','005','清遠市'
UNIONALLSELECT'007','006','小分市'
GO
--查詢指定節點及其所有子節點的函數
CREATEFUNCTION f_Cid(@IDchar(3))
RETURNS@t_LevelTABLE(ID char(3),Levelint)
AS
BEGIN
DECLARE@Levelint
SET@Level=1
INSERT@t_LevelSELECT@ID,@LevelWHILE@@ROWCOUNT>0
BEGIN
SET@Level=@Level+1INSERT@t_LevelSELECT a.ID,@LevelFROM tb a,@t_Level b WHERE a.PID=b.ID AND b.Level=@Level-1ENDRETURNENDGO
--調用函數查詢002及其所有子節點
SELECT a.*FROM tb a,f_Cid('002') b WHERE a.ID=b.ID
