SQL递归查询(with cte as)

with cte as
(
select Id,Pid,DeptName,0 as lvl from Department
where Id = 2
union all
select d.Id,d.Pid,d.DeptName,lvl+1 from cte c inner join Department d
on c.Id = d.Pid
)

select * from cte

表结构:

Id Pid DeptName
----------- ----------- --------------------------------------------------
1 0 总部
2 1 研发部
3 1 测试部
4 1 质量部
5 2 小组1
6 2 小组2
7 3 测试1
8 3 测试2
9 5 前端组
10 5 美工

查询结果 查部门ID=2的所有下级部门和本级

Id Pid DeptName lvl
----------- ----------- -------------------------------------------------- -----------
2 1 研发部 0
5 2 小组1 1
6 2 小组2 1
9 5 前端组 2
10 5 美工 2



原理(摘自网上)

  递归CTE最少包含两个查询(也被称为成员)。第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点。第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。

递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数的最大限制时才停止递归。是指递归次数上限的方法是使用MAXRECURION。

时间: 2024-10-28 00:14:19

SQL递归查询(with cte as)的相关文章

写一个mysql数据库的sql 递归查询,我现在有个能查询三级的,谁能帮我改为查询四级或五级的

问题描述 select distinct * from (select * from news_types where news_types.id=1 union select n2.* from news_types n1,news_types n2 where n1.id=1 and n2.parentid=n1.id union select n3.* from news_types n3,( select n2.* from news_types n1,news_types n2 whe

有关数据库SQL递归查询在不同数据库中的实现方法_MsSql

本文给大家介绍有关数据库SQL递归查询在不同数据库中的实现方法,具体内容请看下文. 比如表结构数据如下: Table:Tree ID Name ParentId 1 一级  0 2  二级 1 3  三级 2 4 四级 3 SQL SERVER 2005查询方法: //上查 with tmpTree as ( select * from Tree where Id=2 union all select p.* from tmpTree inner join Tree p on p.Id=tmpT

SQL递归查询几种实现方法

SQL递归查询几种实现方法 表结构 ProductCategory CategoryID,Level,ParentCategoryID 数据 1,1,-1 2,1,-1 3,2,1 4,3,3 5,2,2 6,4,5 T-SQL WITH CategoryTemp(CategoryID,ParentCategoryID)--临时表用来保存查到的Category ( SELECT CategoryID,ParentCategoryID FROM ProductCategory WHERE Pare

有关数据库SQL递归查询在不同数据库中的实现方法

本文给大家介绍有关数据库SQL递归查询在不同数据库中的实现方法,具体内容请看下文. 比如表结构数据如下: Table:Tree ID Name ParentId 1 一级  0 2  二级 1 3  三级 2 4 四级 3 SQL SERVER 2005查询方法: //上查 with tmpTree as ( select * from Tree where Id=2 union all select p.* from tmpTree inner join Tree p on p.Id=tmpT

SQL递归查询(SqlServer/ORACLE递归查询)[语法差异分析]

在 SQLSERVER2005以后,mssql开始有了递归查询的方法了.比较起最开始写存储过程或者写function的方式.这样的方式更加简便灵活的. 而oracle也有自带的树形结构递归查询方法,connect by 下面我自己写的一段SQL,简单注释下CTE共用表达式的一些用法. 实现对树状结构的根节点和子节点的查询. 代码 -------------------------------------------------------------------------- author:jc

SQL递归查询实例

递归查询实例 http://justcramer.com/2010/05/30/scaling-threaded-comments-on-django-at-disqus/   create table comments ( id SERIAL PRIMARY KEY, message VARCHAR, author VARCHAR, parent_id INTEGER REFERENCES comments(id) ); insert into comments (message, autho

Sql学习第二天——SQL DML与CTE概述_MsSql

DML (Data Manipulation Language) 与 CTE (Common Table Expression) 今天看书时遇到的两个缩写,不知道其含义,于是就百度了一下,特地在此记录下来,以便于下次复习使用. 关于DML (Data Manipulation Language): 数据操纵语言,用户能够查询数据库以及操作已有数据库中的数据的计算机语言.具体是指是UPDATE更新.INSERT插入.DELETE删除. 关于CTE (Common Table Expression)

SQL技巧(二) - CTE(公用表达式)初步接触

CTE - Common Table Expression(公用表达式)是SQL 2005最重要的改进之一. 子查询有时候使用起来嵌套很复杂, 而使用#tmp类似的临时表, 性能又比较差. 这个时候,介于两者之间的解决方案,CTE诞生了. 我们可以用它来替代临时表 在使用CTE时应注意如下几点: 1. CTE后面必须直接跟使用CTE的SQL语句(如select.insert.update等),否则,CTE将失效 2. CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(

Sql学习第二天——SQL DML与CTE概述

DML (Data Manipulation Language) 与 CTE (Common Table Expression) 今天看书时遇到的两个缩写,不知道其含义,于是就百度了一下,特地在此记录下来,以便于下次复习使用. 关于DML (Data Manipulation Language): 数据操纵语言,用户能够查询数据库以及操作已有数据库中的数据的计算机语言.具体是指是UPDATE更新.INSERT插入.DELETE删除. 关于CTE (Common Table Expression)