IF (OBJECT_ID('DEPT') IS NOT NULL)
  DROP TABLE DEPT
CREATE TABLE DEPT(ID INT,PID INT, NAME VARCHAR(20))
INSERT INTO DEPT VALUES
(1,0,'集团'),
(2,1,'公司A'),
(3,1,'公司B'),
(4,2,'部门A1'),
(5,2,'部门A2'),
(6,2,'部门A3'),
(7,3,'部门B1'),
(8,3,'部门B2'),
(9,5,'小组A2_1'),
(10,8,'小组B2_1')
SELECT * FROM DEPT
--求一个部门的所有下级,如[部门A2] 的所有下级'
;WITH D(ID,PID,NAME,LVL)
AS(
  SELECT ID,PID,NAME,0 LVL FROM DEPT WHERE NAME='部门A2' 
  UNION ALL
  SELECT DEPT.ID,DEPT.PID,DEPT.NAME,LVL +1  
  FROM DEPT INNER JOIN D ON DEPT.PID=D.ID 
)
SELECT * FROM D
/*
ID  PID NAME    LVL
--  --- --------- ---
5 2 部门A2    0
9 5 小组A2_1  1
*/
--求一个部门的所有上级,如[部门B2] 的所有上级'
;WITH D(ID,PID,NAME,LVL)
AS(
  SELECT ID,PID,NAME,0 LVL FROM DEPT WHERE NAME='部门B2'
  UNION ALL
  SELECT DEPT.ID,DEPT.PID,DEPT.NAME,LVL +1  
  FROM DEPT INNER JOIN D ON DEPT.ID=D.PID
)
SELECT * FROM D
/*
ID  PID NAME  LVL
--  --- ------  ---
8 3 部门B2  0
3 1 公司B 1
1 0 集团  2
*/