SQL Server 通过“with as”方法查询树型结构

摘要:
通过连接由自己的whitas创建的表达式,其连接条件是递归条件。可以从根节点向下搜索,从子节点搜索到父节点。只需反转连接条件。例如,如果代码中的条件更改为t.ID=c.ParentId,则可以使用treeselect*fromtreewhereAuthor通过选项设置最大递归次数。例如,上诉结果的最大级别为2,这意味着递归两次。

一、with as 公用表表达式

  类似VIEW,但是不并没有创建对象,WITH  AS 公用表表达式不创建对象,只能被后随的SELECT语句,其作用:

  1. 实现递归查询(树形结构)

  2. 可以在一个语句中多次引用公用表表达式,使其更加简洁

二、非递归的公共表达式

  可以是定义列或自动列和select into 效果差不多

--指定列
with withTmp1 (code,cName)
as
(
    select id,Name from ClassUnis
)
select * from withTmp1
--自动列
with withTmp2 
as
(
    select * from ClassUnis
    where Author = 'system'
)
select * from withTmp2

三、递归的方式

  通过UNION ALL 连接部分。通过连接自身whit as 创建的表达式,它的连接条件就是递归的条件。可以从根节点往下查找,从子节点往父节点查找。只需要颠倒一下连接条件。例如代码中条件改为t.ID = c.ParentId即可

with tree as(
    --0 as Level 定义树的层级,从0开始
    select *,0 as Level 
    from ClassUnis
    where ParentId is null
    union all
    --t.Level + 1每递归一次层级递增
    select c.*,t.Level + 1 
    from ClassUnis c,tree t
    where c.ParentId = t.ID
    --from ClassUnis c inner join tree t on c.ParentId = t.ID
)
select * from tree where Author not like'%/%'

SQL Server 通过“with as”方法查询树型结构第1张

  还能通过option(maxrecursion Number) 设置最大递归次数。例如上诉结果Level 最大值为2表示递归两次。我们设置其值为1

with tree as(
    select *,0 as Level from ClassUnis where ParentId is null
    union all
    select c.*,t.Level + 1 from ClassUnis c,tree t where c.ParentId = t.ID
)
select * from tree where Author not like'%/%' 
option(maxrecursion 1)

 SQL Server 通过“with as”方法查询树型结构第2张

 SQL Server 通过“with as”方法查询树型结构第3张

免责声明:文章转载自《SQL Server 通过“with as”方法查询树型结构》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MATLAB 进行五种边缘检测远程连接ubuntu的MongoDB遇到的坑下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql 变量声明及赋值的三种方式

  1.情景展示   在mysql中,如何申明一个变量并进行使用?   MySQL中主要有三种类型的变量:局部变量、系统变量及用户自定义变量。 2.局部变量(无前缀)   2.1 声明变量   作用域:BEGIN,END之间才能访问得到;   适用范围:可以用在存储过程或函数中;   使用前提:必须使用关键词DECLARE或者作为存储过程的输入或输出参数...

mysql如何解除死锁状态

第一种: 前提条件:找到执行非常慢的sql; 如何找呢:还原客户遇到的问题场景,从控制台找到所执行的sql,一句句的去执行,直到找到执行非常慢的sql 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程(如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程) show proces...

jQuery操作input值总结

  1、获取选中的值: 获取一组radio被选中项的值: var item = $("input[@name=items]:checked").val(); 获取select被选中项的文本: var item = $("select[@name=items] option[@selected]").text(); select下拉框的第二个元素为当...

SQL语句中IF的简单使用

MySQL的IF既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用: IF表达式 IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数...

MyBatis(二)

API: Resources:将核心配置文件加载到流中; SqlsessionFactoryBuilsder:用于构造SqlsessionFactory SqlSessionFactory:构建SqlSeeion对象 接口代理方法实现对Dao层的开发 1.映射文件和dao层下的接口名一致 编译后在同一个文件夹中 2.映射文件的namespace的名字与接口...

Oracle 数据库常用SQL语句(2)查询语句

一、SQL基础查询 1、select语句 格式:select 字段 from 表名; 2、where 用于限制查询的结果。3、查询条件 > < >= <= = !=4、与 或(AND,OR)5、在 不在(IN,NOT IN)练习:查询工号为1,9,11,16且工资低于1000的员工。6、在 [a,b] (between val1 a...