使用SqlServer CTE递归查询处理树、图和层次结构

作者:mrr 时间:2024-01-16 07:35:42 

CTE(Common Table Expressions)是从SQL Server 2005以后版本才有的。指定的临时命名结果集,这些结果集称为CTE。 与派生表类似,不存储为对象,并且只在查询期间有效。与派生表的不同之处在于,CTE 可自引用,还可在同一查询中引用多次。使用CTE能改善代码可读性,且不损害其性能。

递归CTE是SQL SERVER 2005中重要的增强之一。一般我们在处理树,图和层次结构的问题时需要用到递归查询。

CTE的语法如下


WITH CTE AS
(
  SELECT EmpId, ReportTo, FName FROM Employ WHERE EmpId=
  UNION ALL
  SELECT emp.EmpId, emp.ReportTo, emp.FName FROM CTE JOIN Employ as emp ON CTE.EmpId=emp.ReportTo
)


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


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




USE AdventureWorks;
GO
--Creates an infinite loop
WITH cte (EmployeeID, ManagerID, Title) as
(
  SELECT EmployeeID, ManagerID, Title
  FROM HumanResources.Employee
  WHERE ManagerID IS NOT NULL
 UNION ALL
  SELECT cte.EmployeeID, cte.ManagerID, cte.Title
  FROM cte
  JOIN HumanResources.Employee AS e
    ON cte.ManagerID = e.EmployeeID
)
--Uses MAXRECURSION to limit the recursive levels to
SELECT EmployeeID, ManagerID, Title
FROM cte
OPTION (MAXRECURSION );
GO

以上内容就是本文给大家介绍的使用SqlServer CTE递归查询处理树、图和层次结构,希望大家喜欢。

标签:sqlserver,cte,递归
0
投稿

猜你喜欢

  • asp.net下降文本格式数据导入到数据库中的代码

    2024-01-21 16:13:04
  • coreseek 搜索英文的问题详解

    2023-11-20 14:12:10
  • Pandas中GroupBy具体用法详解

    2023-08-10 04:16:42
  • 使用python实现希尔、计数、基数基础排序的代码

    2023-07-12 09:02:24
  • GO语言映射(Map)用法分析

    2024-04-28 09:17:53
  • Python技能树共建之python urllib 模块

    2023-02-07 04:02:40
  • pyinstaller通过spec文件打包py程序的步骤

    2021-02-05 01:49:57
  • python中字符串变二维数组的实例讲解

    2021-08-03 04:37:56
  • 在Python的Bottle框架中使用微信API的示例

    2022-06-02 00:12:47
  • 深入理解mysql的自连接和join关联

    2024-01-21 11:40:01
  • MySQL基础教程第一篇 mysql5.7.18安装和连接教程

    2024-01-15 18:55:19
  • Python实现异常检测LOF算法的示例代码

    2023-11-03 08:05:01
  • 理解 javascript 中的函数表达式与函数声明

    2024-04-23 09:08:26
  • asp+jsp+JavaScript动态实现添加数据行

    2023-07-03 05:37:15
  • golang网络通信超时设置方式

    2024-05-09 09:39:27
  • 关于TypeScript模块导入的那些事

    2024-06-07 15:57:46
  • python3.5 email实现发送邮件功能

    2023-06-14 15:58:59
  • laravel添加前台跳转成功页面示例

    2023-11-20 15:22:18
  • Python中使用sklearn进行特征降维的方法

    2021-09-20 06:23:50
  • 自定义Django_rest_framework_jwt登陆错误返回的解决

    2021-02-27 22:07:32
  • asp之家 网络编程 m.aspxhome.com