WITH AS 语句在部门层级关系中的应用

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
 */

官网文档参考:

WITH common_table_expression (Transact-SQL)

https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql

原文地址:https://www.cnblogs.com/liangchua/p/6635385.html