`

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  
      楼主辛苦了 很好的例子!

相关推荐

    oracle递归、迭代

    Oracle使用递归查询。查询树结构的sql。在Oracle中,递归查询要用到start with ……connect by prior……

    DB2递归实现

    实现ORACLE 的CONNECT by。可以实现一些难以在db2上实现的递归操作

    Oracle SQL树形结构查询

    oracle中的select语句可以用START WITH…CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: 代码如下:select * from tablename start with cond1 connect by cond2 where cond3;...

    使用BULK COLLECT, MERGE 语句提高sql执行效率

    详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询

    程序员的SQL金典.rar

     11.9.3 My SQL Server和DB2中递归查询 附录A 常用数据库系统的安装和使用  A.1 DB2的安装和使用  A.2 MySQL的安装和使用  A.3 Oracle的安装和使用  A.4 Microsoft SQL Server的安装和使用

    程序员的SQL金典4-8

     11.9.3 My SQL Server和DB2中递归查询 附录A 常用数据库系统的安装和使用  A.1 DB2的安装和使用  A.2 MySQL的安装和使用  A.3 Oracle的安装和使用  A.4 Microsoft SQL Server的安装和使用 显示部分信息

    PostgreSQL树形结构的递归查询示例

    Oracle提供的connect by扩展语法,简单好用。但是其他的RDBMS就没这么人性化了(或者我不知道)。最近在项目中使用PostgreSQL来查询树形数据,记录一下。 构造样本数据 drop table if exists demo.tree_data; ...

    SQL培训第一期

    //递归查询子节点 1.8.7 union 和 union all 1.8.7.1 语法 select * from dual union all select * from dual 1.8.7.2 说明 union 会对查询数据进行去重并排序,union all只是简单的将两个结果合并。 1.8.8 wm_...

    程序员的SQL金典6-8

     11.9.3 My SQL Server和DB2中递归查询 附录A 常用数据库系统的安装和使用  A.1 DB2的安装和使用  A.2 MySQL的安装和使用  A.3 Oracle的安装和使用  A.4 Microsoft SQL Server的安装和使用 显示部分信息

    程序员的SQL金典7-8

     11.9.3 My SQL Server和DB2中递归查询 附录A 常用数据库系统的安装和使用  A.1 DB2的安装和使用  A.2 MySQL的安装和使用  A.3 Oracle的安装和使用  A.4 Microsoft SQL Server的安装和使用 显示部分信息

    程序员的SQL金典3-8

     11.9.3 My SQL Server和DB2中递归查询 附录A 常用数据库系统的安装和使用  A.1 DB2的安装和使用  A.2 MySQL的安装和使用  A.3 Oracle的安装和使用  A.4 Microsoft SQL Server的安装和使用 显示部分信息

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    10.3 递归子查询 273 10.3.1 一个CONNECT BY的例子 274 10.3.2 使用RSF的例子 275 10.3.3 RSF的限制条件 276 10.3.4 与CONNECT BY的不同点 276 10.4 复制CONNECT BY的功能 277 10.4.1 LEVEL伪列 278 10.4.2 ...

    MySQL实现树状所有子节点查询的方法

    在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点。但很遗憾,在MySQL的目前版本中还没有对应的功能。 在MySQL中如果是有限的层次,比如我们事先如果...

    (3.0版本)自己写的struts2+hibernate+spring实例

    所以用了递归查询. criteria.add(Restrictions.sqlRestriction("MENUITEM_ID in(select a.MENUITEM_ID from Wuxin_MENUITEM a connect by prior a.MENUITEM_ID = a.PARENT_ID"+ " start with a.MENUITEM_ID = '"+...

    精髓Oralcle讲课笔记

    59、select avg(sal) from emp where sal >1200 group by deptno having avg(sal) >1500 order by avg(sal) desc;--求出sal>1200的平均值按照deptno分组,平均值要>1500最后按照sal的倒序排列 60、select ename,...

Global site tag (gtag.js) - Google Analytics