SQL 遞歸

-- 查詢指定部門下面的全部部門, 並彙總各部門的下級部門數
DECLARE @Dept_name nvarchar(20)
SET @Dept_name = N'MIS'
;WITH
DEPTS AS(   -- 查詢指定部門及其下的全部子部門
 -- 定位點成員
 SELECT * FROM Dept
 WHERE name = @Dept_name
 UNION ALL
 -- 遞歸成員, 經過引用CTE自身與Dept基表JOIN實現遞歸
 SELECT A.*
 FROM Dept A, DEPTS B
 WHERE A.parent_id = B.id
),
DEPTCHILD AS(  -- 引用第1個CTE,查詢其每條記錄對應的部門下的全部子部門
 SELECT 
  Dept_id = P.id, C.id, C.parent_id
 FROM DEPTS P, Dept C
 WHERE P.id = C.parent_id
 UNION ALL
 SELECT 
  P.Dept_id, C.id, C.parent_id
 FROM DEPTCHILD P, Dept C
 WHERE P.id = C.parent_id
),
DEPTCHILDCNT AS( -- 引用第2個CTE, 彙總獲得各部門下的子部門數
 SELECT 
  Dept_id, Cnt = COUNT(*)
 FROM DEPTCHILD
 GROUP BY Dept_id
)
SELECT    -- JOIN第1,3個CTE,獲得最終的查詢結果
 D.*,
 ChildDeptCount = ISNULL(DS.Cnt, 0)
FROM DEPTS D
 LEFT JOIN DEPTCHILDCNT DS
  ON D.id = DS.Dept_id
GO

-- 刪除演示環境
DROP TABLE Dept



本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/fredrickhu/archive/2009/09/19/4569529.aspx
相關文章
相關標籤/搜索