CREATE TABLE DEPT ( DEPT_ID NVARCHAR(20) NOT NULL PRIMARY KEY ,DEPT_NAME NVARCHAR(40) ,PARENT_ID NVARCHAR(20) ) GO INSERT INTO DEPT(DEPT_ID,DEPT_NAME,PARENT_ID) SELECT '10','工厂A','' UNION ALL SELECT '11','车间A','10' UNION ALL SELECT '12','车间B','10' UNION ALL SELECT '13','生产线1','11' UNION ALL SELECT '14','生产线2','11' UNION ALL SELECT '15','生产线3','11' UNION ALL SELECT '16','工序1组','13' UNION ALL SELECT '17','工序2组','13' --(1)查询指定部门的上级部门 DECLARE @dept_id NVARCHAR(20) SET @dept_id='13'; WITH w_dept AS ( SELECT d.* FROM dbo.DEPT d WHERE d.DEPT_ID = @dept_id UNION ALL SELECT d.* FROM dbo.DEPT d INNER JOIN w_dept ON d.dept_id = w_dept.PARENT_ID ) SELECT * FROM w_dept ORDER BY DEPT_ID /* 延伸应用: 在部门表DEPT中增长层级LEVEL,就能够定位到某个层级的部门,好比找出当前部门的二级父部门 SELECT * FROM w_dept WHERE LEVEL=2 */ --(2)查询指定部门的下属部门 DECLARE @dept_id NVARCHAR(20) SET @dept_id='13'; WITH w_dept AS ( SELECT d.* FROM dbo.DEPT d WHERE d.DEPT_ID = @dept_id UNION ALL SELECT d.* FROM dbo.DEPT d INNER JOIN w_dept ON d.PARENT_ID = w_dept.DEPT_ID ) SELECT * FROM w_dept ORDER BY DEPT_ID /* 延伸应用: 把部门编号串成一个字符串,而后查询当前部门及下属部门全部员工 DECLARE @TEMPS NVARCHAR(MAX) SELECT @TEMPS=ISNULL(@TEMPS,'') + RTRIM(DEPT_ID) +'|' FROM w_dept SELECT @TEMPS SELECT * FROM EMP WHERE CHARINDEX(RTRIM(DEPT_ID)+'|',@TEMPS)>0 */
官网文档参考:sql
WITH common_table_expression (Transact-SQL)express
https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sqlspa