首页
学习
活动
专区
圈层
工具
发布

SQL中的递归查询

递归查询原理 SQL Server中的递归查询是通过CTE(表表达式)来实现。...至少包含两个查询,第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点;第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。...在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。 递归查询的终止条件 递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数的最大限制时才停止递归。...2、迭代公式是 UNION ALL 下面的查询语句。在查询语句中调用中CTE,而查询语句就是CTE的组成部分,即 “自己调用自己”,这就是递归的真谛所在。...具体结果如下: 以上就是递归查询的一些知识介绍了,自己可以动手实验一下,这个一般在面试中也经常会考察面试者,希望能帮助到大家~

6.5K11

oracle中如何优雅的递归查询

一条sql怎么查出单表中含有父子关系的数据呢?...tableName start with id='370883101000' connect by prior parent=id image.png start with子句: 递归的条件...,需要注意的是如果with后面的值是子节点那么求出的就是他的父节点和祖宗节点,如果是父节点那么求出的就是他的子节点和子孙节点,如果不懂可以把上面start with 后面的条件改成 p.parent=0...关键词prior,prior跟它右边的父节点放在一起(prior p.parent)表示往父节点方向遍历, 反之,如果 prior跟子节点放在一起(prior p.id)表示往叶子方向遍历。...这里需要注意的 =p.id 放在prior关键词的前面或者后面都没什么关系,也就是上面可以这样写 p.id= prior p.paren。重要的是prior旁边放的

11.9K62
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    递归查询

    ------------------------------------------------------------------------ Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用...pid = id MSSQL ---------------------------------------------------------------------------------- 使用递归公用表表达式显示递归的多个级别...以下示例显示经理以及向经理报告的雇员的层次列表。...使用递归公用表表达式显示递归的两个级别。 以下示例显示经理以及向经理报告的雇员。将返回的级别数目被限制为两个。...使用递归公用表表达式显示层次列表 以下示例在示例 C 的基础上添加经理和雇员的名称,以及他们各自的头衔。通过缩进各个级别,突出显示经理和雇员的层次结构。

    1.6K40

    PostgreSQL=>递归查询

    ,但字段的个数一定要与3~5行中的查询结果的个数一致!   ...=>"el"是声明的虚拟表,每次递归一层后都会将本层数据写入el中   =>第三行中的id=3是需要查询开始层的ID,关键是第五行=>需要将虚拟表“el"表与“elevel”实体表连表查询   =>特别需要注意的是第三行中的中的...,不然查询报错,个人理解这是PostgreSQL根据首行的记录来递归子记录 好了,需要总结的大概就是这些,至于第七行中的rpad函数是向右补齐的函数,用于排序的需要,读者可以略去order by之后的内容...SQL与之上的查询不同的是第三行中定义了一个"Array[id]" 的递归结构字段,最为和一个“1” 的深度字段,Array函数是PostgreSQL特有的数组函数,读者可以自行查阅资料了解哈( ^)o...,关键,关键是=>第5行的where条件,很意外吧,如此小的改动就有查询方向上的变化,个人对此的理解是:  =>递归向下查询是用虚拟表的id去联结递归表的parent_id   =>递归向上查询是用虚拟表的

    1.6K30

    PostgreSQL=>递归查询

    3~5行中的查询结果的个数一致!   ...=>"el"是声明的虚拟表,每次递归一层后都会将本层数据写入el中   =>第三行中的id=3是需要查询开始层的ID,关键是第五行=>需要将虚拟表“el"表与“elevel”实体表连表查询   =>特别需要注意的是第三行中的中的...,不然查询报错,个人理解这是PostgreSQL根据首行的记录来递归子记录 好了,需要总结的大概就是这些,至于第七行中的rpad函数是向右补齐的函数,用于排序的需要,读者可以略去order by之后的内容...SQL与之上的查询不同的是第三行中定义了一个"Array[id]" 的递归结构字段,最为和一个“1” 的深度字段,Array函数是PostgreSQL特有的数组函数,读者可以自行查阅资料了解哈( ^)o...,关键,关键是=>第5行的where条件,很意外吧,如此小的改动就有查询方向上的变化,个人对此的理解是:  =>递归向下查询是用虚拟表的id去联结递归表的parent_id   =>递归向上查询是用虚拟表的

    2.6K50

    PostgreSQL=>递归查询

    ,但字段的个数一定要与3~5行中的查询结果的个数一致!   ...=>"el"是声明的虚拟表,每次递归一层后都会将本层数据写入el中   =>第三行中的id=3是需要查询开始层的ID,关键是第五行=>需要将虚拟表“el"表与“elevel”实体表连表查询   =>特别需要注意的是第三行中的中的...,不然查询报错,个人理解这是PostgreSQL根据首行的记录来递归子记录 好了,需要总结的大概就是这些,至于第七行中的rpad函数是向右补齐的函数,用于排序的需要,读者可以略去order by之后的内容...SQL与之上的查询不同的是第三行中定义了一个"Array[id]" 的递归结构字段,最为和一个“1” 的深度字段,Array函数是PostgreSQL特有的数组函数,读者可以自行查阅资料了解哈( ^)o...,关键,关键是=>第5行的where条件,很意外吧,如此小的改动就有查询方向上的变化,个人对此的理解是:  =>递归向下查询是用虚拟表的id去联结递归表的parent_id   =>递归向上查询是用虚拟表的

    1.8K80

    SQLServer CTE 递归查询

    在TSQL脚本中,也能实现递归查询,SQL Server提供CTE(Common Table Expression),只需要编写少量的代码,就能实现递归查询,递归查询主要用于层次结构的查询,从叶级(Leaf...第二个查询被称为递归子查询成员:该子查询调用CTE名称,触发递归查询,实际上是递归子查询调用递归子查询。   在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。...事务执行失败,该事务包含的所有操作都被回滚。在产品环境中,慎用maxrecursion 查询提示,推荐通过 where 条件限制递归的次数。...3.递归步骤: step1:定点子查询设置CTE的初始值,即CTE的初始值Set0;递归调用的子查询过程:递归子查询调用递归子查询; step2:递归子查询第一次调用CTE名称,CTE名称是指CTE...step2:迭代公式是 union all 下面的查询语句。在查询语句中调用中cte,而查询语句就是cte的组成部分,即 “自己调用自己”,这就是递归的真谛所在。

    2.6K20

    SQL 高级查询 ——(层次化查询,递归)

    (叶节点表示没有子节点的节点) 假如我们要把这些产品信息存储到数据库中,会形成如下数据表。 ? 我们用 parent_product_id 列表示当前产品的父产品是哪一个。...START WITH 表示从哪一个产品开始查询,CONNECT BY PRIOR 表示父节点与子节点的关系,每一个产品的 ID 指向一个父产品。...递归查询 除了使用上面我们说的方法,还可以使用递归查询得到同样的结果。递归会用到 WITH 语句。普通的 WITH 语句可以看作一个子查询,我们在 WITH 外部可以直接使用这个子查询的内容。...当递归查询时,我们是在 WITH 语句内部来引用这个子查询。还是上面的例子,我们使用 WITH 语句来查询。...查询结果如下: ? 可以看到第一列是展示的产品层级,和我们上面查询出来的结果是一致的。 同时使用 WITH 递归时还可以使用深度优先搜索和广度优先搜索,什么意思呢?

    4.9K10
    领券