`

SQL connect by递归查询

 
阅读更多

今天有空学习了Oracle的递归查询connect by语句,想借助博客把我的理解与你分享,如果有什么不足请多多包含。

Oracle中的start with ... connect by...语句可以实现递归查询。我们就用该语句实现将树形结构保存到表中。表结构如下:

create table TREETEST
(
    cityid   INTEGER not null, -- 行政区划代码
    cityname VARCHAR2(100),    -- 行政区划名称
    parname  VARCHAR2(100),    -- 上级行政区划代码
    salary   NUMBER(19,6)      -- 当前行政区划的平均薪水(随意填写的,不具有参考价值)
)
 现在我将下面树状图的数据保存到数据库中,如下图:


 添加到数据库后的结构如下图所示:


 从上图中不能明显的看出行政区划的层级关系,现在我们通过connect by语句在每行的行政区划前面加入空格,使呈现出明显的层级关系,SQL语句如下:

select Level , cityid, parname, cityname, salary,
          lpad(' ', 8*(Level-1)) || cityname as parentName 
  from treetest a 
start with a.cityid=1 connect by a.parname = prior a.cityid;
 结果如下:


 其中“parentName”列展示了行政级别的层级关系。解释一下以上SQL语句的具体含义:

start with语句表示树从什么位置开始进行检索。

    如:start with a.cityid=1(从行政区划代码等于1的行政区划开始进行检索,即从“中国”开始进行检索)

connect by语句表示当前数据行和下一行数据之间的关系。

prior 语句表示那个字段属于前一行(英文解释:优先的;在先的,在前的

    如:connect by a.parname = prior a.cityid;

           表示当前行的parname等于上一行的cityid。

 

上面属于从根部(root)往叶子(children)节点进行检索,现在我们演示从叶子节点往根部进行检索,只需要将connect by后面的条件进行交换即可,如:检索“金牛区”的所有上级行政区划

select Level , cityid, parname, cityname, salary, 
          lpad(' ', 8*(Level-1)) || cityname as parentName 
  from treetest a 
start with a.cityid=14 connect by a.cityid = prior a.parname;

 其中

start with a.cityid=14 表示从“金牛区”开始检索

connect by a.cityid = prior a.parname 表示当前行的cityid 等于上一行的parname 

结果如下:


 

从“北京”检索所有属于北京的行政区划,SQL代码:

select Level , cityid, parname, cityname, salary, 
          lpad(' ', 8*(Level-1)) || cityname as parentName 
  from treetest a
start with a.cityid=2 connect by a.parname = prior a.cityid;

 结果如下:


 

使用connect by过滤掉某些行政区划,那么这个行政区划的所有子行政区划也将被过滤掉。如:不检索“上海市”及其子行政区划,SQL代码:

select Level , cityid, parname, cityname, salary, 
          lpad(' ', 8*(Level-1)) || cityname as parentName 
  from treetest a
start with a.cityid=1 connect by a.parname = prior a.cityid and a.cityid!=3;

 结果如下:


 

我们也可以使用where子句进行过滤操作,但是不会将指定行政区划的所有子行政区划过滤掉。我们还是以过滤“上海市”为列,SQL代码:

select Level , cityid, parname, cityname, salary, 
          lpad(' ', 8*(Level-1)) || cityname as parentName 
  from treetest a where a.cityid!=3
start with a.cityid=1 connect by a.parname = prior a.cityid;

结果如下:


 

 基本规则:

a、使用connect by时各个子句的顺序为:

     1. select

     2. from

     3. where

     4. start with

     5. connect by

     6. order by

 b、prior强制树的顺序变为从根到叶或从叶到根

 c、where子句可以从树中排除个体,但是不能排除它们的子孙

 d、connect by中的条件可以排除个体也能排除所有它们的子孙

 e、connect by不能和where子句中表连接使用

 

 

 

 

 

 

 

  • 大小: 4.3 KB
  • 大小: 15.2 KB
  • 大小: 20.8 KB
  • 大小: 6.9 KB
  • 大小: 5.4 KB
  • 大小: 15 KB
  • 大小: 19 KB
分享到:
评论
1 楼 masuweng 2017-10-20  
      楼主辛苦了 很好的例子!

相关推荐

    数据库设计之递归树查询

    本文将深入探讨如何通过递归查询来解决这类问题,并着重讲解使用`WITH`语句来实现递归查询的方法,适用于多种数据库系统,如MySQL、PostgreSQL、SQL Server等。 一、理解递归查询 递归查询是一种在数据库中遍历层级...

    递归查询菜单树,支持mysql,oracle

    Oracle数据库也支持递归查询,但使用的是`CONNECT BY`语句。对于同样的`menus`表,Oracle的查询可能如下: ```sql SELECT id, parent_id, name, level as depth FROM menus START WITH parent_id IS NULL CONNECT ...

    Oracle start with.connect by prior子句实现递归查询

    ### Oracle Start With.Connect By Prior 子句实现递归查询 #### 概述 在Oracle数据库中,`Start With.Connect By Prior`子句是执行递归查询的一种强大工具,主要用于处理层次结构数据。这类数据通常存在于组织...

    connect_by_prior_递归算法

    ### Oracle中的Connect By Prior递归算法详解 #### 一、Connect By Prior 子句概述 在Oracle数据库中,`Connect By Prior`子句是一种非常有用的工具,尤其在处理具有层次结构的数据时。它允许用户以一种简洁的方式...

    SQL语句 递归

    在Oracle中,递归查询主要通过`START WITH`和`CONNECT BY PRIOR`子句实现。 ### 二、递归查询的基本语法 递归查询的基本语法如下: ```sql SELECT column_name(s) FROM table_name START WITH condition CONNECT ...

    SQL语句-递归查询、分组、统计.pdf

    在Oracle数据库中,可以使用`CONNECT BY`语句实现递归查询。例子中展示了如何通过`CONNECT BY`从`um_organization`表中查找特定`orgid`的上级和下级组织,以及生成整个组织结构树。`START WITH`指定递归的起始条件,...

    MySQL多种递归查询方法.docx

    在Oracle数据库中,递归查询可以通过`START WITH CONNECT BY PRIOR`语句实现。此语句允许用户按照树状结构来检索数据。 ##### 1. `START WITH CONNECT BY PRIOR`用法详解 **基本语法**: ```sql SELECT * FROM ...

    Oracle递归SQL学习

    这是递归查询的起点,`#id#`是一个占位符,表示我们从特定的ID开始递归查询。这通常是我们希望展示的树的根节点或当前选定的节点。 2. `connect by prior parent_id = id` 这是Oracle递归查询的关键部分。`...

    Oracle递归树形结构查询功能

    在进行递归查询优化时,要注意避免无限循环和性能问题,确保`CONNECT BY`条件正确无误,必要时还可以使用`CYCLE`子句来检测并处理循环引用。同时,合理利用索引可以显著提升查询效率。 总之,Oracle的递归树形结构...

    深入sql oracle递归查询

    Oracle则使用`START WITH` 和 `CONNECT BY` 子句来实现递归查询。对于上述相同的表结构,查询1号节点的所有子节点的Oracle SQL语句如下: ```sql SELECT * FROM aaa START WITH id = 1 CONNECT BY pid = PRIOR id; ...

    oracle递归查询的例子

    在数据库查询语言中,Oracle 提供了一种强大的功能——递归查询,这在其他数据库系统如 SQL Server 中是缺失的功能。递归查询允许用户执行多级关联查询,特别适用于处理具有层次结构的数据,例如组织结构图、文件...

    一种MySQL数据库SQL递归查询的研究与实现.pdf

    CONNECT BY PRIOR`子句直接支持递归查询,而SQL Server 2005及以上版本则利用公共表表达式(CTE)的递归调用来实现。POSTgreSQL同样支持CTE子查询进行递归。这些数据库允许在SQL语句中直接对子查询进行递归调用,...

    在db2和oracle中的对树的递归查询语句

    在Oracle中,对树的递归查询主要依赖于`CONNECT_BY`功能。`CONNECT_BY`是Oracle SQL的一个扩展,用于处理层次查询。它允许我们通过指定的连接条件来遍历层级数据,从而进行递归查询。例如,我们可以用以下方式查询一...

    Oracle递归查询

    在Oracle数据库中,递归查询主要依赖于`START WITH`和`CONNECT BY PRIOR`两个关键语法。本文将详细介绍这些概念以及具体的使用方法。 #### 二、创建示例表 为了更好地理解Oracle中的递归查询,我们首先需要创建...

    oracle递归、迭代

    ### Oracle中的递归查询详解 #### 一、引言 在数据库管理中,处理具有层次结构的数据是一项常见的任务。例如,在组织结构、产品分类或文件系统等场景中,经常需要查询这种类型的层级数据。Oracle数据库提供了强大...

    connect by的使用探索

    Connect By是一种递归查询语句,用于实现树形结构的查询和遍历。它是 Oracle 数据库中的一种特色语句,能够高效地查询树形结构的数据。 Connect By的基本语法 Connect By语句的基本语法如下: ```sql SELECT [/*+ ...

    Oracle中的树状查询(递归查询)

    递归查询基于`CONNECT BY`子句,它允许我们定义一个起始点并根据特定条件进行递归。`PRIOR`关键字用于指定当前行与父行的关系。通过这些工具,Oracle可以构建出一个层次结构,展示出数据的树状关系。 2. **基本...

    10.2.0.3版本 with改造递归查询

    Oracle数据库支持通过`CONNECT BY`和`START WITH`子句实现递归查询。递归查询通常用于处理层次结构数据,如组织结构、文件系统等。 ##### 2. WITH子句 WITH子句是Oracle SQL中的一个特性,它允许用户定义一个临时...

Global site tag (gtag.js) - Google Analytics