首页 > 数据库 >T-SQL查询:WITH AS 递归计算某部门的所有上级机构或下级机构

T-SQL查询:WITH AS 递归计算某部门的所有上级机构或下级机构

时间:2023-01-10 21:33:39浏览次数:38  
标签:NAME 机构 PID DEPT 递归计算 SQL LVL ID SELECT



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






标签:NAME,机构,PID,DEPT,递归计算,SQL,LVL,ID,SELECT
From: https://blog.51cto.com/hzc2012/6000716

相关文章

  • Mysql中的锁:表、MDL、意向锁、行锁
    元数据锁SHARE_READ/EXCLUSIVE:共享锁:在DQL/DML的时候给表加SHARE_READ/WRITE锁,与排它锁互斥作用:在A事务未提交的情况下,B事务不能修改表结构排他锁:在DDL的时候给......
  • MSSQL结合RBCD提权
    MSSQL结合RBCD提权原理这里使用中继的方式给他中继到ldap中去添加msDS-AllowedToActOnBehalfOfOtherIdentity属性。默认域控的ms-DS-MachineAccountQuota属性设置允许所......
  • SQL Server 斐波那契数列
    斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现......
  • SQL Server 2008 R2 使用 PIVOT 错误
    SQLServer2008R2使用PIVOT错误!'PIVOT'附近有语法错误。您可能需要将当前数据库的兼容级别设置为更高的值,以启用此功能。有关ALTERDATABASE的SETCOMPATIBILITY_L......
  • 一条sql语句循环插入N条不同记录
    SETNOCOUNTONIF(OBJECT_ID('TB')ISNOTNULL)DROPTABLETBGOCREATETABLETB(IDINTIDENTITY(1,1),NAMEVARCHAR(40))GOINSERTINTOTB(NAME)......
  • Mysql切割字符串
     我们常常会遇到需要处理字段中字符串的需求,包括切割、拼接以及搜索等等,在这里介绍几个常用的切割字符串的函数,首先我们在表格中加入我们的实验字段值:https://www.cnblogs......
  • mysql 增量备份
    查询binlog日志是否开启showvariableslike'%log_bin%'查询表内容  flushlogs刷新日志  删除数据后测试 ......
  • mysql 入库时间不对,差8个小时
    极大可能是时区导致的mysql入库时间不对1.关注mysql时区2.关注系统时区3.关注jdbc链接时区(就是jdbc链接mysql的url是否设置了时区) 参考:https://guozh.net/mysql-ti......
  • mysql 时间段查询 SQL优化
    转https://blog.csdn.net/qq_34103387/article/details/125781283分析:目的取包含开始时间的1234时间段,排除AB段时间注意<>自行替换1.直接查4个段or连接((start_t......
  • mysql5.7 主从更改 同步位置信息
    更改同步位置,同步主机信息,同步用户信息等,需要先停掉从机,然后操作,进而启动slavemysql>stopslave;mysql>changemastertomaster_host='10.132.100.1';mysql>startsla......