提及這個需求,有點反常規,左邊是組織機構樹,右邊是組織機構對應的員工列表。點擊左側組織機構時傳一個組織機構ID,而後查詢該組織機構以及其所屬的一級節點,若是有部門直屬單擊節點組織機構,則掛出來員工總數,也就是說根節點不須要向下遞歸,只須要查詢出對應的員工記錄便可,相反,因此的一級節點則須要向下遞歸計算出全部的員工總數。剛開始只知道遞歸,沒有具體的思路,後一個同事幫忙寫了一個,後發現思路確實巧妙,因此本身拿出來再分析分享下。node
一、單擊根節點不須要向下遞歸,那麼則把單擊根節點單獨拿出來。sql
二、一級節點須要向下遞歸查詢出其所屬節點,那麼首先根據ParentID查詢出你傳入的組織機構ID所屬的一級節點組織機構(CTE遞歸),同時生成一個id(StartId)用來標識該組織機構隸屬的組織機構,向上統計時會用到。spa
三、把單獨拿出來的根節點和一級子節點及其所屬節點用UNION ALL拼接起來,準備統計時使用。blog
四、統計總數時GROUP BY 使用StartId來分組。遞歸
with t as( select * from dbo.orgInfo where pid=1 ), p as( select a.id,a.node,a.pid,a.id as StartId from dbo.orgInfo A where id in (select t.id from t) union all select K.id,K.node,K.pid,c.StartId as StartId from dbo.orgInfo K inner join p C on k.pid=C.id ), q as( select a.id,a.node,a.pid,A.id as StartId from dbo.orgInfo A where id=1 union select * from p ) --select * from q select q.id,q.node,m.Total from q inner join ( select q.StartId,COUNT(1) as Total from q inner join dbo.userInfo a on a.OrgID=q.id group by q.StartId )m on q.id=m.StartId