首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL Server:如何将CTE递归限制为只是递归添加的行?

在 SQL Server 中,递归公用表表达式 (CTE) 是一种强大的工具,可以用来处理层次结构数据。然而,有时候我们需要限制递归的深度,以避免递归地添加过多的行。以下是如何在 SQL Server 中使用递归 CTE 来限制递归添加的行的方法:

  1. 首先,定义一个 CTE,其中包含基本查询和递归查询。基本查询是从某个起点开始的,而递归查询是从上一级递归到下一级的。
  2. 在递归查询中,使用一个计数器列来跟踪递归的深度。
  3. 在递归查询中,使用 WHERE 子句来限制递归的深度。

以下是一个示例,展示了如何使用递归 CTE 来限制递归添加的行:

代码语言:sql
复制
WITH EmployeeCTE (EmployeeID, FirstName, LastName, JobTitle, RecursionLevel)
AS
(
    -- 基本查询:选择起点
    SELECT e.EmployeeID, e.FirstName, e.LastName, e.JobTitle, 0 AS RecursionLevel
    FROM Employees AS e
    WHERE e.EmployeeID = 1 -- 指定起点

    UNION ALL

    -- 递归查询:选择下一级
    SELECT e.EmployeeID, e.FirstName, e.LastName, e.JobTitle, EmployeeCTE.RecursionLevel + 1 AS RecursionLevel
    FROM Employees AS e
    INNER JOIN EmployeeCTE
    ON e.ReportsTo = EmployeeCTE.EmployeeID
    WHERE EmployeeCTE.RecursionLevel < 2 -- 限制递归的深度
)

-- 查询结果
SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel
FROM EmployeeCTE
ORDER BY RecursionLevel, FirstName, LastName;

在这个示例中,我们限制了递归的深度为 2 级。这意味着我们只能递归地添加两级层次结构。如果需要更改递归的深度,只需更改 WHERE 子句中的值即可。

推荐的腾讯云相关产品:

产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SQL中 WITH AS 使用方法

为此,在SQL Server 2005中提供了另外一种解决方案,这就是公用表表达式(CTE),使用CTE,可以使SQL语句可维护性,同时,CTE要比表变量效率高得多。...) 其中cte是一个公用表表达式,该表达式在使用上与表变量类似,只是SQL Server 2005在处理公用表表达式方式上有所不同。...'C%' ) -- 加上这句会报错,应将这条SQL语句去掉 select * from person.CountryRegion -- 使用CTESQL语句应紧跟在相关CTE后面 -- select...如果CTE表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用仍然是CTE,当然,后面的SQL语句使用就是数据表或视图了,如下面的SQL语句所示: -- table1是一个实际存在表...以下示例特意创建了一个无限循环,然后使用 MAXRECURSION 提示将递归级别限制为两级 WITH cte (EmployeeID, ManagerID, Title) as ( SELECT

15610

SQLServer中CTE通用表表达式

当使用 SQL Server™ 2005 时,我更倾向于第三种方案,就是使用通用表表达式 (CTE)。CTE 能改善代码可读性(以及可维护性),且不会有损其性能。...此外,与早期版本 SQL Server 相比,它们使得用 T-SQL 编写递归代码简单了许多。   首先,我将介绍 CTE 工作原理以及可用它们来应对情况。...另外,CTE 是语言级别的构造,也就是说 SQL Server 不会在内部创建临时表或虚拟表。每次在紧随其后查询中引用 CTE 底层查询时都会调用它。...CTE 以 WITH 关键字开始。然而,如果 CTE 不是批处理中第一个语句,则必须在 WITH 关键字前添加一个分号。...作为最佳做法,我倾向于在所有的 CTE 之前都加上一个分号作为前缀,我发现这种一致方式比起必须牢记是否需要添加分号来,要容易得多。

3.8K10
  • 记录下关于SQL Server东西

    member),基本格式如下: 定位点成员只是返回有效关系结果表查询,与用于非递归查询类似,定位点成员查询只被执行一次。...递归成员是一个引用了CTE名称查询,对CTE名称引用表示查询在一个执行序列中逻辑上“前一个结果集”,第一次调用递归成员时,它表示就是定位点成员查询结果,之后调用递归时,引用CTE则代表前一次调用所返回结果集... server 2005以后便可使用T_SQLpivot来做透视转换: PIVOT运算符也是在查询from子句上下文中执行操作。...PIVOT运算符同样设计前面介绍三个逻辑处理阶段(分组、扩展和聚合)和同样透视转换元素,但使用是不同SQL Server原生(native)语法。...select * from cte_order pivot(sum (qty) for custid in(A,B,C,D)) as newtable SQL Server 2008引入了merge语句

    1.3K10

    MySQL8.0.19-通过Limit调试递归CTE

    尽管这只是一个小示例,但CTE可以永远递归还有其他原因:查询可能非常复杂,我们犯了逻辑错误;或数据集可能是格式错误层次结构,并且包含意外循环。...他正在寻找发现问题方法。 因此,无论出于何种原因,您所遇到只是上述3636错误,现在该怎么办? 如果查询有数十,您如何了解逻辑错误在哪里?...因此,递归算法将开始工作,照常运行迭代,累积,并在这些数量超过LIMIT时停止。这时CTE将被视为已完成,并且不会发出任何错误。...在我们例子里: ? 首先是火星,然后是木星,土星,地球,火星!好吧,我们看到似乎在5之后形成循环;通过在到达每个行星附近添加路径上前一个行星,它变得更加清晰: ? 发现了!...在本文结尾,虽然LIMIT-in-CTE可能不会改变SQL 面貌,但我相信它几乎可以为在MySQL中操作递归CTE每个人节省时间,这是一件非常好事情! 一如既往,感谢您选择MySQL!

    1.4K30

    SQLServer CTE 递归查询

    在TSQL脚本中,也能实现递归查询,SQL Server提供CTE(Common Table Expression),只需要编写少量代码,就能实现递归查询,递归查询主要用于层次结构查询,从叶级(Leaf...) -- Statement using the CTE SELECT * FROM cte_name   第一个查询为定点成员:定点成员只是一个返回有效表查询,用于递归基础或定位点。   ...(maxrecursion 0);当递归查询达到指定或默认 MAXRECURSION 数量限制时,SQL Server将结束查询并返回错误,如下: The statement terminated....; step4:在第N次执行递归子查询时,CTE名称是指Set(N-1),递归子查询都引用前一个递归子查询结果集; Step5:如果递归子查询返回空数据,或超出递归次数最大限制,停止递归;...4.Sql递归优点:   效率高,大量数据集下,速度比程序查询快。

    1.6K20

    SQL递归实现循环判断

    直到最近看了一篇关于SQL递归查询文章,躁动DNA又动了~ SQL递归查询简介 首先,简单介绍下什么是SQL递归查询。...递归查询是通过CTE(表表达式)来实现,至少包含两个查询,第一个查询为定点成员,定点成员只是一个返回有效表查询,用于递归基础或定位点;第二个查询被称为递归成员,使该查询称为递归成员是对CTE名称递归引用是触发...不过Oracle和SQL Server是支持递归查询,可以在一些在线网站上进行尝试。...image-20230224185521017 案例二:SQL递归实现斐波那契数列 这里用SQL OnLine中SQL Server,界面是真的清爽。...,但不幸是,oraclecte表里不支持嵌套(即复杂嵌套查询),SQL Server也不支持外连接(left)。

    2.6K20

    SQL递归查询

    递归查询原理 SQL Server递归查询是通过CTE(表表达式)来实现。...至少包含两个查询,第一个查询为定点成员,定点成员只是一个返回有效表查询,用于递归基础或定位点;第二个查询被称为递归成员,使该查询称为递归成员是对CTE名称递归引用是触发。...在逻辑上可以将CTE名称内部应用理解为前一个查询结果集。 递归查询终止条件 递归查询没有显式递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数最大限制时才停止递归。...递归常见形式 WITH CTE AS ( SELECT column1,column2......在查询语句中调用中CTE,而查询语句就是CTE组成部分,即 “自己调用自己”,这就是递归真谛所在。

    20411

    你真的会玩SQL吗?表表达式,排名函数

    表表达式 期待单个值地方可以使用标量子查询 期待多个值地方可以使用多值子查询 在期待出现表地方可用表值子查询或表表达式 1.派生表 是从查询表达式派生出虚拟结果表表表达式,派生表存在范围只是外部查询...2.公用表表达式(CTE) 非递归公用表表达式(CTE)是查询结果仅仅一次性返回一个结果集用于外部查询调用。...递归公用表达式 来引用他人一个示例: 先建一张表栏目表如下,栏目Id,栏目名称,栏目的父栏目 ?...在order by子句中定义列上,如果返回一数据与另一具有相同值,rank函数将给这些赋予相同排名数值。在排名过程中,保持一个内部计数值,当值有所改变时,排名序号将有一个跳跃。...WHERE DuplicateCount > 1 GO /*用SQL SERVER CTE,它将重新生成一个相同但附加了一编号表。

    1.9K90

    关于使用CTE(公用表表达式)递归查询

    递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集公用表表达式。   当某个查询引用递归 CTE 时,它即被称为递归查询。...递归 CTE 可以极大地简化在 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句中运行递归查询所需代码。...在 SQL Server 早期版本中,递归查询通常需要使用临时表、游标和逻辑来控制递归步骤流。 ...--运行 CTE 语句为:     SELECT FROM expression_name; 在使用CTE时应注意如下几点: CTE后面必须直接跟使用CTESQL语句(...如果CTE表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用仍然是CTE,当然,后面的SQL语句使用就是数据表或视图。 4.

    1.4K20

    MySQL 8.0 新增SQL语法对窗口函数和CTE支持

    公用表表达式   CTE有两种用法,非递归CTE递归CTE。   ...非递归CTE可以用来增加代码可读性,增加逻辑结构化表达。   ...平时我们比较痛恨一句sql几十甚至上上百,根本不知道其要表达什么,难以理解,对于这种SQL,可以使用CTE分段解决,   比如逻辑块A做成一个CTE,逻辑块B做成一个CTE,然后在逻辑块A和逻辑块B...另外一种是递归CTE递归的话,应用场景也比较多,比如查询大部门下子部门,每一个子部门下面的子部门等等,就需要使用递归方式。   ...窗口函数和CTE增加,简化了SQL代码编写和逻辑实现,并不是说没有这些新特性,这些功能都无法实现,只是新特性增加,可以用更优雅和可读性方式来写SQL

    2.2K20

    MYSQL 8.019 CTE 递归查询怎么解决死循环三种方法

    MYSQL CTE 是8.0 引入SQL 查询一种功能,通过CTE 可以将复杂SQL 变得简单,便于分析和查询....其中CTE 有一种功能递归, 并且牵扯到递归就会有一个问题提出,就是无限递归问题....递归查询中出现3636问题,分为两种 1 数据出现问题 (这是引起递归出现问题常见原因) 2 SQL 递归撰写有问题 根据1 出现问题概率比较大,并且比较难以排查, 这里就需要在写SQL...时候,添加一些语句来避免递归出现问题. 1 方法一, 使用distinct ,通过在union 后面添加distinct 来将重复数据去掉,大部分死循环是因为有重复数据,这样可以查出数据....但在SQL 撰写中如果业务逻辑合适, 递归会将SQL比较简单,但需要给定数据要符合一定规律,以上方式均是想通过一定方式来规避由于数据问题,产生递归问题.

    1.9K30

    根据上一填充本行空白栏位,SQL处理方式

    在录入学生成绩时候,如果成绩为NULL,就表示该学生成绩和上一个学生成绩相同。现在要查询某个学生ID成绩,该怎么查呢?或者要将成绩字段改为不允许为空,怎么把所有NULL填上成绩呢?...,那么应该先去查学生5成绩,由于学生5也是空,所以要继续查前一个学生4成绩,得到分数3,所以学生6成绩是3.这显然是一个递归问题,如果一直是空,会继续递归下去,直到找到一个成绩为止。...要在SQL中使用递归,那么第一个应该想到就是公用表表达式CTE。...关于CTE语法和说明可以看MSDN:https://msdn.microsoft.com/zh-cn/library/ms186243.aspx 那么我们这里递归终点是什么呢?...那么简单办法就是使用开窗函数给每一数据增加一列连续自增列,SQL Server函数是ROW_NUMBER().这样就变成了两个CTE嵌套使用,请看代码: 1 with t1new  2 as

    48730

    SQL 必须了解10个高级概念

    2.递归CTEs. 递归CTE是引用自己CTE,就像Python中递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间链接图等分层数据,尤其有用。...递归CTE有3个部分: 锚构件:返回CTE基本结果初始查询 递归成员:引用CTE递归查询。...这是所有与锚构件联盟 停止递归构件终止条件 以下是获取每个员工ID管理器ID递归CTE示例: with org_structure as ( SELECT id ,...它们都用来比较两个查询/表之间。所说,这两个人之间存在微妙细微差别。 首先,除了过滤删除重复并返回不同与不在中不同行。...在SQL中,您可以使用几种方式将“等级”分配给,我们将使用示例进行探索。

    12610

    10 个高级 SQL 查询技巧

    2.递归CTEs. 递归CTE是引用自己CTE,就像Python中递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间链接图等分层数据,尤其有用。...递归CTE有3个部分: 锚构件:返回CTE基本结果初始查询 递归成员:引用CTE递归查询。...这是所有与锚构件联盟 停止递归构件终止条件 以下是获取每个员工ID管理器ID递归CTE示例: with org_structure as ( SELECT id ,...它们都用来比较两个查询/表之间。所说,这两个人之间存在微妙细微差别。 首先,除了过滤删除重复并返回不同与不在中不同行。...在SQL中,您可以使用几种方式将“等级”分配给,我们将使用示例进行探索。

    18410

    SQL 必须了解10个高级概念

    2.递归CTEs. 递归CTE是引用自己CTE,就像Python中递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间链接图等分层数据,尤其有用。...递归CTE有3个部分: 锚构件:返回CTE基本结果初始查询 递归成员:引用CTE递归查询。...这是所有与锚构件联盟 停止递归构件终止条件 以下是获取每个员工ID管理器ID递归CTE示例: with org_structure as ( SELECT id ,...它们都用来比较两个查询/表之间。所说,这两个人之间存在微妙细微差别。 首先,除了过滤删除重复并返回不同与不在中不同行。...在SQL中,您可以使用几种方式将“等级”分配给,我们将使用示例进行探索。

    1.1K30

    SQL高级知识:递归查询

    SQL刷题专栏 SQL145题系列 递归查询原理 SQL递归查询是通过CTE(表表达式)来实现。...至少包含两个查询: 第一个查询为定点成员,定点成员只是一个返回有效表查询,用于递归基础或定位点; 第二个查询被称为递归成员,使该查询称为递归成员是对CTE名称递归引用是触发。...在逻辑上可以将CTE名称内部应用理解为前一个查询结果集。 递归查询终止条件 递归查询没有显式递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数最大限制时才停止递归。...递归查询优点 效率高,大量数据集下,速度比程序查询快。 递归常见形式 WITH CTE AS ( SELECT column1,column2......在查询语句中调用中CTE,而查询语句就是CTE组成部分,即 “自己调用自己”,这就是递归真谛所在。

    26610

    10 个高级 SQL 概念

    2.递归CTEs. 递归CTE是引用自己CTE,就像Python中递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间链接图等分层数据,尤其有用。...递归CTE有3个部分: 锚构件:返回CTE基本结果初始查询 递归成员:引用CTE递归查询。...这是所有与锚构件联盟 停止递归构件终止条件 以下是获取每个员工ID管理器ID递归CTE示例: with org_structure as ( SELECT id ,...它们都用来比较两个查询/表之间。所说,这两个人之间存在微妙细微差别。 首先,除了过滤删除重复并返回不同与不在中不同行。...在SQL中,您可以使用几种方式将“等级”分配给,我们将使用示例进行探索。

    94810

    必知必会十个高级 SQL 概念

    递归 CTEs. 递归 CTE 是引用自己 CTE,就像 Python 中递归函数一样。递归 CTE 尤其有用,它涉及查询组织结构图,文件系统,网页之间链接图等分层数据,尤其有用。...递归 CTE 有 3 个部分: 锚构件:返回 CTE 基本结果初始查询 递归成员:引用 CTE 递归查询。...这是所有与锚构件联盟 停止递归构件终止条件 以下是获取每个员工 ID 管理器 ID 递归 CTE 示例: ``` with org_structure as ( SELECT id...使用 CASE WHEN 枢转数据 您很可能会看到许多要求在陈述时使用 CASE WHEN 问题,这只是因为它是一种多功能概念。如果要根据其他变量分配某个值或类,则允许您编写复杂条件语句。...在 SQL 中,您可以使用几种方式将 “等级” 分配给,我们将使用示例进行探索。

    94400

    程序员需要了解十个高级SQL概念

    2.递归CTEs. 递归CTE是引用自己CTE,就像Python中递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间链接图等分层数据,尤其有用。...递归CTE有3个部分: 锚构件:返回CTE基本结果初始查询 递归成员:引用CTE递归查询。...这是所有与锚构件联盟 停止递归构件终止条件 以下是获取每个员工ID管理器ID递归CTE示例: with org_structure as ( SELECT id ,...它们都用来比较两个查询/表之间。所说,这两个人之间存在微妙细微差别。 首先,除了过滤删除重复并返回不同与不在中不同行。...在SQL中,您可以使用几种方式将“等级”分配给,我们将使用示例进行探索。

    1.2K10
    领券