SQL Server遞歸實例


 

 

例子一

-- ============================================= -- 根據EID返回其下屬的EID,Layer=1表示直接下屬,NULL返回所有下屬 -- select EID FROM F_Team_GetSubordinate(2,NULL) -- ============================================= CREATE FUNCTION F_Team_GetSubordinate( @EID INT, @Layer INT) RETURNS @tb TABLE (EID INT,NameCN varchar(50),SupervisorEID INT,Layer INT) AS BEGIN ;WITH CTE AS ( SELECT EID,NameCn,SupervisorEID,0 as Layer FROM TCFG_Employee WHERE EID=@EID UNION ALL SELECT A.EID,A.NameCn,A.SupervisorEID,Layer=layer+1 FROM TCFG_Employee A JOIN CTE B ON A.SupervisorEID = B.EID ) INSERT INTO @tb select EID,NameCN,SupervisorEID,Layer from CTE where (@Layer IS NULL OR Layer=@Layer) return END GO

例子二

--[員工]表含成層級關系 CREATE TABLE Employees ( empid INT NOT NULL, mgrid INT NULL,--管理者ID字段,用於鏈接empid empname VARCHAR (25) NOT NULL, salary money NOT NULL, CONSTRAINT PK_Employees PRIMARY KEY (empid), ) GO -- 插入實例數據,允許員工的管理者ID字段為null, INSERT INTO Employees VALUES(1, NULL, 'Nancy', $10000.00) INSERT INTO Employees VALUES(2, 1, 'Andrew', $5000.00) INSERT INTO Employees VALUES(3, 1, 'Janet', $5000.00) INSERT INTO Employees VALUES(4, 1, 'Margaret',$5000.00) INSERT INTO Employees VALUES(5, 2, 'Steven', $2500.00) INSERT INTO Employees VALUES(6, 2, 'Michael', $2500.00) INSERT INTO Employees VALUES(7, 3, 'Robert', $2500.00) INSERT INTO Employees VALUES(8, 3, 'Laura', $2500.00) INSERT INTO Employees VALUES(9, 3, 'Ann', $2500.00) INSERT INTO Employees VALUES(10, 4, 'Ina', $2500.00) INSERT INTO Employees VALUES(11, 7, 'David', $2000.00) INSERT INTO Employees VALUES(12, 7, 'Ron', $2000.00) INSERT INTO Employees VALUES(13, 7, 'Dan', $2000.00) INSERT INTO Employees VALUES(14, 11, 'James', $1500.00) GO --Create Departments table and insert demo values CREATE TABLE Departments ( deptid INT NOT NULL PRIMARY KEY, deptname VARCHAR (25) NOT NULL, deptmgrid INT NULL REFERENCES Employees --部門管理者ID,外鍵參考Employees的empid字段 ) GO INSERT INTO Departments VALUES (1, 'HR', 2) INSERT INTO Departments VALUES (2, 'Marketing', 7) INSERT INTO Departments VALUES (3, 'Finance', 8) INSERT INTO Departments VALUES (4, 'R&D', 9) INSERT INTO Departments VALUES (5, 'Training', 4) INSERT INTO Departments VALUES (6, 'Gardening', NULL) GO -- 這個自定義函數根據用工ID,返回他所有的下屬(包括下屬的下屬,即所有層) CREATE FUNCTION dbo.fn_getsubtree(@empid AS INT) RETURNS @TREE TABLE ( empid INT NOT NULL, empname VARCHAR(25) NOT NULL, mgrid INT NULL, lvl INT NOT NULL ) AS BEGIN WITH Employees_Subtree(empid, empname, mgrid, lvl) AS --lvl層級字段  ( -- Anchor Member (AM) SELECT empid, empname, mgrid, 0 FROM employees WHERE empid = @empid --這個查詢輸出將作為下個查詢的輸入! -- 下屬,即那些管理者字段的值等於自己的Employee字段 UNION all -- Recursive Member (RM) SELECT e.empid, e.empname, e.mgrid, es.lvl+1 FROM employees AS e JOIN employees_subtree AS es --employees_subtree是WITH后面的變量名,相當於JOIN自己鏈接自己 ON e.mgrid = es.empid ) INSERT INTO @TREE SELECT * FROM Employees_Subtree RETURN END GO -- Call for show SELECT * FROM fn_getsubtree(1) --通過這個例子理解CROSS APPLY 說明:表Departments和自定義函數fn_getsubtree鏈接 --查詢每個部門管理者他們包含(所有層次)的下屬,特別說明,返回的結果集的記錄存在部分記錄字段重復 --因為fn_getsubtree是返回所有層次的下屬,所以下面的查詢也返回每個部門下所有層次的下屬 SELECT * FROM Departments AS D CROSS APPLY fn_getsubtree(D.deptmgrid) AS ST --deptmgrid 部門的領導id

例子三

WITH T AS ( SELECT empid, empname, mgrid,0 AS Lv FROM Employees UNION ALL SELECT e.empid, e.empname, e.mgrid,es.Lv+1 FROM Employees AS e --不支持*號!字段名必須一一寫出來,並且和上面的SELECT一模一樣! JOIN T AS es --鏈接自己啊 ON e.mgrid = es.empid ) SELECT * FROM T 已經在好多場合看到這些的寫法了,所有覺得比較重要. =========================== 用例數表 CREATE TABLE Employees ( empid INT NOT NULL, mgrid INT NULL,--管理者字段,是自鏈接字段! empname VARCHAR (25) NOT NULL, salary money NOT NULL, CONSTRAINT PK_Employees PRIMARY KEY (empid), ) GO -- 允許員工的部門為null, INSERT INTO Employees VALUES(1, NULL, 'Nancy', $10000.00) INSERT INTO Employees VALUES(2, 1, 'Andrew', $5000.00) INSERT INTO Employees VALUES(3, 1, 'Janet', $5000.00) INSERT INTO Employees VALUES(4, 1, 'Margaret',$5000.00) INSERT INTO Employees VALUES(5, 2, 'Steven', $2500.00) INSERT INTO Employees VALUES(6, 2, 'Michael', $2500.00) INSERT INTO Employees VALUES(7, 3, 'Robert', $2500.00) INSERT INTO Employees VALUES(8, 3, 'Laura', $2500.00) INSERT INTO Employees VALUES(9, 3, 'Ann', $2500.00) INSERT INTO Employees VALUES(10, 4, 'Ina', $2500.00) INSERT INTO Employees VALUES(11, 7, 'David', $2000.00) INSERT INTO Employees VALUES(12, 7, 'Ron', $2000.00) INSERT INTO Employees VALUES(13, 7, 'Dan', $2000.00) INSERT INTO Employees VALUES(14, 11, 'James', $1500.00) GO =========================

 


免責聲明!

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



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