遞歸查詢樹形結構的SQL


一.在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','清遠市'
UNION
ALLSELECT'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


免責聲明!

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



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