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

对于SQL递归CTE,为什么不在每次“循环”时再次引用锚成员?为什么锚成员只被“调用”一次?

SQL递归CTE(Common Table Expression)是一种在关系型数据库中处理递归查询的方法。在使用CTE进行递归查询时,锚成员(Anchor Member)是递归查询的起始点,而递归成员(Recursive Member)是在每次迭代中被调用的部分。

为什么不在每次“循环”时再次引用锚成员?

在SQL递归CTE中,锚成员只在递归查询的起始点被引用一次,而不是在每次迭代中都引用。这是因为锚成员的目的是定义递归查询的初始结果集,而不是在每次迭代中生成新的结果集。锚成员的结果集将作为递归成员的输入,并与递归成员进行联接操作,从而生成下一次迭代的结果集。

如果在每次迭代中再次引用锚成员,将导致递归查询无限循环,因为每次迭代都会生成新的结果集,而不是基于上一次迭代的结果集进行计算。这将导致查询无法终止,且结果集会无限增长,最终导致性能问题和内存溢出。

为什么锚成员只被“调用”一次?

锚成员只被调用一次是为了确保递归查询的正确性和效率。在递归查询中,锚成员的目的是定义递归查询的起始点,而递归成员则负责根据上一次迭代的结果生成下一次迭代的结果。因此,锚成员只需要被调用一次来生成初始结果集,而后续的迭代将由递归成员完成。

如果锚成员被多次调用,将导致重复的结果集生成,增加了计算和存储的开销,同时也可能导致结果集的错误。因此,为了保证递归查询的正确性和效率,锚成员只被调用一次。

总结:

在SQL递归CTE中,锚成员只在递归查询的起始点被引用一次,而不是在每次迭代中再次引用。这是为了避免无限循环和结果集的无限增长,保证递归查询的正确性和效率。锚成员的目的是定义递归查询的初始结果集,而递归成员负责根据上一次迭代的结果生成下一次迭代的结果。

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

相关·内容

T-SQL—理解CTEs

每一个递归处理的迭代都返回一个结果的子集。这个递归处理保持循环调用直至达到条件限制才停止。最终的结果集其实就是CTE循环中每一个调用超生的结果集的并集。...递归CTE,包含了至少两个查询定义,一个是select语句,另一个查询作为“成员”,而其他的查询定义作为循环成员成员查询定义不包含CTE循环成员中包括。...最后我使用Select语句引用第二个CTECTE递归调用CTE实例 另一个CTE的主要功能就是调用自己,当用CTE调用自己的时候,就行程了CTE递归调用。...一个递归CTE有两个主要部分,一个是成员,一个是递归成员成员开启递归成员,这里你可以把成员查询当做一个没有引用CTE的查询。而递归成员将会引用CTE。...而我去运行这段代码后,循环了100次,这就是由于最大递归次数的默认为100。当然这个值也是可以设定的。

2K90

T-SQL—理解CTEs

每一个递归处理的迭代都返回一个结果的子集。这个递归处理保持循环调用直至达到条件限制才停止。最终的结果集其实就是CTE循环中每一个调用超生的结果集的并集。...递归CTE,包含了至少两个查询定义,一个是select语句,另一个查询作为“成员”,而其他的查询定义作为循环成员成员查询定义不包含CTE循环成员中包括。...最后我使用Select语句引用第二个CTECTE递归调用CTE实例 另一个CTE的主要功能就是调用自己,当用CTE调用自己的时候,就行程了CTE递归调用。...一个递归CTE有两个主要部分,一个是成员,一个是递归成员成员开启递归成员,这里你可以把成员查询当做一个没有引用CTE的查询。而递归成员将会引用CTE。...而我去运行这段代码后,循环了100次,这就是由于最大递归次数的默认为100。当然这个值也是可以设定的。

1.4K10
  • SQLServer中的CTE通用表表达式

    例如,在图 1 中,已经创建了一个视图,并为另一个 T-SQL 语句所使用。然而,当您想要收集数据并且使用一次的时候,视图未必是最佳解决方案。...另外,CTE 是语言级别的构造,也就是说 SQL Server 不会在内部创建临时表或虚拟表。每次在紧随其后的查询中引用 CTE 的底层查询都会调用它。...CTE 仅能紧随其后的语句所引用。这意味着如果要使用 CTE,则必须紧随 T-SQL 批处理中的 CTE 之后编写引用 CTE 的查询。...当第二个查询引用 myCTE CTE 不在范围之内,并且引发异常(对象名“myCTE”无效)。...这个终止子句负责确保递归算法最后将终止,并弹出了递归调用堆栈。若无此子句,您的代码最终将无限循环下去。   CTE 可从两个方面帮助处理终止子句。首先是一个隐式终止子句,当递归成员返回零记录出现。

    3.8K10

    SQL递归实现循环判断

    SQL递归实现循环判断 以前的文章Python小案例(五)循环判断进行分组介绍了如何使用python解决循环判断的问题。现在重新回顾一下这个问题背景:有一列按照某规则排序后的产品,想打包进行组合售卖。...递归查询是通过CTE(表表达式)来实现,至少包含两个查询,第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点;第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发...递归实现循环判断 从上面的案例我们知道,每次调用自己的时候做一些判断就能实现循环判断了。...这个打包销售的案例最重要的是每次累计价格到2000就需要从下一次重新累积,那是不是只要每次取出达到2000的组合,将剩余的放到下面的union all再进行累积判断就行了呢?...现在大部分互联网企业很少用oracle和SQL Server,所以SQL递归查询就当是一次思维拓展吧,不折腾下你怎么知道自己的上限呢~ 参考资料 [1] SQL Fiddle: http://sqlfiddle.com

    2.6K20

    10 个高级的 SQL 查询技巧

    2.递归CTEs. 递归CTE引用自己的CTE,就像Python中的递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间的链接图等的分层数据,尤其有用。...递归CTE有3个部分: 构件:返回CTE的基本结果的初始查询 递归成员引用CTE递归查询。...这是所有与构件的联盟 停止递归构件的终止条件 以下是获取每个员工ID的管理器ID的递归CTE的示例: with org_structure as ( SELECT id ,...首先,除了过滤删除重复并返回不同的行与不在中的不同行。 同样,除了在查询/表中相同数量的列,其中不再与每个查询/表比较单个列。 6.自联结 一个SQL表自行连接自己。...示例问题:给定下面的员工表,写出一个SQL查询,了解员工的工资,这些员工比其管理人员工资更多。对于上表来说,Joe是唯一一个比他的经理工资更多的员工。

    18410

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

    2.递归CTEs. 递归CTE引用自己的CTE,就像Python中的递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间的链接图等的分层数据,尤其有用。...递归CTE有3个部分: 构件:返回CTE的基本结果的初始查询 递归成员引用CTE递归查询。...这是所有与构件的联盟 停止递归构件的终止条件 以下是获取每个员工ID的管理器ID的递归CTE的示例: with org_structure as ( SELECT id ,...首先,除了过滤删除重复并返回不同的行与不在中的不同行。 同样,除了在查询/表中相同数量的列,其中不再与每个查询/表比较单个列。 6.自联结 一个SQL表自行连接自己。...示例问题:给定下面的员工表,写出一个SQL查询,了解员工的工资,这些员工比其管理人员工资更多。对于上表来说,Joe是唯一一个比他的经理工资更多的员工。

    1.2K10

    10 个高级 SQL 概念

    2.递归CTEs. 递归CTE引用自己的CTE,就像Python中的递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间的链接图等的分层数据,尤其有用。...递归CTE有3个部分: 构件:返回CTE的基本结果的初始查询 递归成员引用CTE递归查询。...这是所有与构件的联盟 停止递归构件的终止条件 以下是获取每个员工ID的管理器ID的递归CTE的示例: with org_structure as ( SELECT id ,...首先,除了过滤删除重复并返回不同的行与不在中的不同行。 同样,除了在查询/表中相同数量的列,其中不再与每个查询/表比较单个列。 6.自联结 一个SQL表自行连接自己。...示例问题:给定下面的员工表,写出一个SQL查询,了解员工的工资,这些员工比其管理人员工资更多。对于上表来说,Joe是唯一一个比他的经理工资更多的员工。

    94810

    SQL 必须了解的10个高级概念

    2.递归CTEs. 递归CTE引用自己的CTE,就像Python中的递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间的链接图等的分层数据,尤其有用。...递归CTE有3个部分: 构件:返回CTE的基本结果的初始查询 递归成员引用CTE递归查询。...这是所有与构件的联盟 停止递归构件的终止条件 以下是获取每个员工ID的管理器ID的递归CTE的示例: with org_structure as ( SELECT id ,...首先,除了过滤删除重复并返回不同的行与不在中的不同行。 同样,除了在查询/表中相同数量的列,其中不再与每个查询/表比较单个列。 6.自联结 一个SQL表自行连接自己。...示例问题:给定下面的员工表,写出一个SQL查询,了解员工的工资,这些员工比其管理人员工资更多。对于上表来说,Joe是唯一一个比他的经理工资更多的员工。

    12710

    必知必会的十个高级 SQL 概念

    递归 CTEs. 递归 CTE引用自己的 CTE,就像 Python 中的递归函数一样。递归 CTE 尤其有用,它涉及查询组织结构图,文件系统,网页之间的链接图等的分层数据,尤其有用。...递归 CTE 有 3 个部分: 构件:返回 CTE 的基本结果的初始查询 递归成员引用 CTE递归查询。...这是所有与构件的联盟 停止递归构件的终止条件 以下是获取每个员工 ID 的管理器 ID 的递归 CTE 的示例: ``` with org_structure as ( SELECT id...示例问题:给定下面的员工表,写出一个 SQL 查询,了解员工的工资,这些员工比其管理人员工资更多。对于上表来说,Joe 是唯一一个比他的经理工资更多的员工。...我希望这有助于您在面试准备中 - 我相信,如果您知道这 10 个内部概念,那么在那里大多数 SQL 问题,你会做得很好。 一如既往,祝你学习努力最好!

    94400

    SQL 必须了解的10个高级概念

    2.递归CTEs. 递归CTE引用自己的CTE,就像Python中的递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间的链接图等的分层数据,尤其有用。...递归CTE有3个部分: 构件:返回CTE的基本结果的初始查询 递归成员引用CTE递归查询。...这是所有与构件的联盟 停止递归构件的终止条件 以下是获取每个员工ID的管理器ID的递归CTE的示例: with org_structure as ( SELECT id ,...首先,除了过滤删除重复并返回不同的行与不在中的不同行。 同样,除了在查询/表中相同数量的列,其中不再与每个查询/表比较单个列。 6.自联结 一个SQL表自行连接自己。...示例问题:给定下面的员工表,写出一个SQL查询,了解员工的工资,这些员工比其管理人员工资更多。对于上表来说,Joe是唯一一个比他的经理工资更多的员工。

    1.1K30

    SQL 必须了解的 10 个高级概念

    2.递归CTEs. 递归CTE引用自己的CTE,就像Python中的递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间的链接图等的分层数据,尤其有用。...递归CTE有3个部分: 构件:返回CTE的基本结果的初始查询 递归成员引用CTE递归查询。...这是所有与构件的联盟 停止递归构件的终止条件 以下是获取每个员工ID的管理器ID的递归CTE的示例: with org_structure as (    SELECT id           , ...首先,除了过滤删除重复并返回不同的行与不在中的不同行。 同样,除了在查询/表中相同数量的列,其中不再与每个查询/表比较单个列。 6.自联结 一个SQL表自行连接自己。...示例问题:给定下面的员工表,写出一个SQL查询,了解员工的工资,这些员工比其管理人员工资更多。对于上表来说,Joe是唯一一个比他的经理工资更多的员工。

    86320

    必须了解的十个高级 SQL 概念

    2.递归CTEs. 递归CTE引用自己的CTE,就像Python中的递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间的链接图等的分层数据,尤其有用。...递归CTE有3个部分: 构件:返回CTE的基本结果的初始查询 递归成员引用CTE递归查询。...这是所有与构件的联盟 停止递归构件的终止条件 以下是获取每个员工ID的管理器ID的递归CTE的示例: with org_structure as ( SELECT id ,...首先,除了过滤删除重复并返回不同的行与不在中的不同行。 同样,除了在查询/表中相同数量的列,其中不再与每个查询/表比较单个列。 6.自联结 一个SQL表自行连接自己。...示例问题:给定下面的员工表,写出一个SQL查询,了解员工的工资,这些员工比其管理人员工资更多。对于上表来说,Joe是唯一一个比他的经理工资更多的员工。

    1.1K20

    记录下关于SQL Server的东西

    CTE之所以与其他表表达式不同,是因为它支持递归查询: 定义一个递归CTE,至少需要两个查询(或者更多),第一个查询称为定位点成员(anchor member),第二个查询称为递归成员(recursive... member),基本格式如下: 定位点成员只是返回有效关系结果表的查询,与用于非递归查询类似,定位点成员查询被执行一次。...递归成员是一个引用CTE名称的查询,对CTE名称的引用表示查询在一个执行序列中逻辑上的“前一个结果集”,第一次调用递归成员,它表示的就是定位点成员的查询结果,之后调用递归引用CTE则代表前一次调用所返回的结果集...递归成员没有显示的递归终止检查,递归成员会一直重复调用,直到返回空的结果集或者超出了某种限制条件。...在返回的查询结果上,两个成员必须保持一直(列的属性); 例如: 定位点成员对HR.Employees表中empid=2的结果进行查询,这个查询执行一次递归成员则对CTE(前一次查询的结果集)和Employees

    1.3K10

    SQL高级知识:递归查询

    SQL刷题专栏 SQL145题系列 递归查询原理 SQL中的递归查询是通过CTE(表表达式)来实现。...至少包含两个查询: 第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点; 第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。...在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。 递归查询的终止条件 递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数的最大限制才停止递归。...在查询语句中调用CTE,而查询语句就是CTE的组成部分,即 “自己调用自己”,这就是递归的真谛所在。...所谓迭代,是指每一次递归都要调用一次查询的结果集,UNION ALL是指每次都把结果集并在一起。

    26710

    SQL中的递归查询

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

    20511

    SQLServer CTE 递归查询

    第二个查询被称为递归子查询成员:该子查询调用CTE名称,触发递归查询,实际上是递归子查询调用递归子查询。   在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。...3.递归步骤: step1:定点子查询设置CTE的初始值,即CTE的初始值Set0;递归调用的子查询过程:递归子查询调用递归子查询; step2:递归子查询第一次调用CTE名称,CTE名称是指CTE...的初始值Set0,第一次执行递归子查询之后,CTE名称是指结果集Set1; step3:递归子查询第二次调用CTE名称,CTE名称是指Set1,第二次执行递归子查询之后,CTE名称是指结果集Set2...; step4:在第N次执行递归子查询CTE名称是指Set(N-1),递归子查询都引用前一个递归子查询的结果集; Step5:如果递归子查询返回空数据行,或超出递归次数的最大限制,停止递归;...所谓迭代,是指每一次递归都要调用一次查询的结果集,Union ALL是指每次都把结果集并在一起。

    1.6K20

    硬钢百度面试!

    所以在实现多态,当用基类操作派生类,在析构防止析构基类而不析构派生类的状况发生,要将基类的析构函数声明为虚函数。 为什么构造函数不写为虚函数?...从使用角度:虚函数的作用在于通过父类的指针或者引用调用它的时候能够变成调用子类的那个成员函数。...而构造函数是在创建对象自动调用的,不可能通过父类的指针或者引用调用,因此也就规定构造函数不能是虚函数。...定义要分配空间,不能在类声明中初始化,必须在类定义体外部初始化,初始化时不需要标示为static;可以非static成员函数任意访问。...静态局部变量初始化一次,并且之后再次调用函数不再重新分配空间和赋初值,而保留上次函数调用结束的值(而普通局部变量每调用一次就会重新分配空间并赋一次初值) 静态局部变量默认初始化为0 函数调用结束之后静态局部变量依然存在

    19220

    SQL优化(五) PostgreSQL (递归CTE 通用表表达式

    而WITH中的SELECT语句则输出主语句中所需要记录数。 WITH中使用多个子句,这些子句和主语句会并行执行,所以当存在多个修改子语句修改相同的记录,它们的结果不可预测。...目前,任何一个数据修改CTE的表,不允许使用条件规则,和ALSO规则以及INSTEAD规则。...对于本身并不会形成循环引用的数据集,无段作特别处理。而对于本身可能形成循环引用的数据集,则须通过SQL处理。...CTE名字的子查询 同时使用多个CTE表达式,不允许多表达式之间互相访问(支持单向访问) 在recursive term中不允许使用FOR UPDATE CTE 优缺点 可以使用递归 WITH RECURSIVE...,从而实现其它方式无法实现或者不容易实现的查询 当不需要将查询结果其它独立查询共享,它比视图更灵活也更轻量 CTE只会被计算一次,且可在主查询中多次使用 CTE可极大提高代码可读性及可维护性 CTE

    2.6K60

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

    2.公用表表达式(CTE) 非递归公用表表达式(CTE)是查询结果仅仅一次性返回一个结果集用于外部查询调用。...WITH CTE_Test   AS   (   SELECT * FROM Person_1   )   SELECT * FROM CTE_Test AS a  --第一次引用   INNER...JOIN CTE_Test AS b    --第二次引用   ON a.Id = b.Id   ORDER BY a.Id DESC --SELECT * FROM CTE_Test 再查询一次会报错...c.ParentId,ce.tLevel+1 AS tLevel FROM COL as c INNER JOIN COL_CTE AS ce   --递归调用 ON c.ParentId...在此方案中,我们有Col1,Col2以及包含这个两列重复数的列,对于不同的查询,这个重复数的列可能有不同的值。另一点需要注意的是,一旦CTE创建,DELETE语句就可以运行了。

    1.9K90
    领券