今天有空学习了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子句中表连接使用
相关推荐
本文将深入探讨如何通过递归查询来解决这类问题,并着重讲解使用`WITH`语句来实现递归查询的方法,适用于多种数据库系统,如MySQL、PostgreSQL、SQL Server等。 一、理解递归查询 递归查询是一种在数据库中遍历层级...
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中的Connect By Prior递归算法详解 #### 一、Connect By Prior 子句概述 在Oracle数据库中,`Connect By Prior`子句是一种非常有用的工具,尤其在处理具有层次结构的数据时。它允许用户以一种简洁的方式...
在Oracle中,递归查询主要通过`START WITH`和`CONNECT BY PRIOR`子句实现。 ### 二、递归查询的基本语法 递归查询的基本语法如下: ```sql SELECT column_name(s) FROM table_name START WITH condition CONNECT ...
在Oracle数据库中,可以使用`CONNECT BY`语句实现递归查询。例子中展示了如何通过`CONNECT BY`从`um_organization`表中查找特定`orgid`的上级和下级组织,以及生成整个组织结构树。`START WITH`指定递归的起始条件,...
在Oracle数据库中,递归查询可以通过`START WITH CONNECT BY PRIOR`语句实现。此语句允许用户按照树状结构来检索数据。 ##### 1. `START WITH CONNECT BY PRIOR`用法详解 **基本语法**: ```sql SELECT * FROM ...
这是递归查询的起点,`#id#`是一个占位符,表示我们从特定的ID开始递归查询。这通常是我们希望展示的树的根节点或当前选定的节点。 2. `connect by prior parent_id = id` 这是Oracle递归查询的关键部分。`...
在进行递归查询优化时,要注意避免无限循环和性能问题,确保`CONNECT BY`条件正确无误,必要时还可以使用`CYCLE`子句来检测并处理循环引用。同时,合理利用索引可以显著提升查询效率。 总之,Oracle的递归树形结构...
在Oracle中,对树的递归查询主要依赖于`CONNECT_BY`功能。`CONNECT_BY`是Oracle SQL的一个扩展,用于处理层次查询。它允许我们通过指定的连接条件来遍历层级数据,从而进行递归查询。例如,我们可以用以下方式查询一...
Connect By是一种递归查询语句,用于实现树形结构的查询和遍历。它是 Oracle 数据库中的一种特色语句,能够高效地查询树形结构的数据。 Connect By的基本语法 Connect By语句的基本语法如下: ```sql SELECT [/*+ ...
Oracle则使用`START WITH` 和 `CONNECT BY` 子句来实现递归查询。对于上述相同的表结构,查询1号节点的所有子节点的Oracle SQL语句如下: ```sql SELECT * FROM aaa START WITH id = 1 CONNECT BY pid = PRIOR id; ...
在数据库查询语言中,Oracle 提供了一种强大的功能——递归查询,这在其他数据库系统如 SQL Server 中是缺失的功能。递归查询允许用户执行多级关联查询,特别适用于处理具有层次结构的数据,例如组织结构图、文件...
CONNECT BY PRIOR`子句直接支持递归查询,而SQL Server 2005及以上版本则利用公共表表达式(CTE)的递归调用来实现。POSTgreSQL同样支持CTE子查询进行递归。这些数据库允许在SQL语句中直接对子查询进行递归调用,...
在Oracle数据库中,递归查询主要依赖于`START WITH`和`CONNECT BY PRIOR`两个关键语法。本文将详细介绍这些概念以及具体的使用方法。 #### 二、创建示例表 为了更好地理解Oracle中的递归查询,我们首先需要创建...
### Oracle中的递归查询详解 #### 一、引言 在数据库管理中,处理具有层次结构的数据是一项常见的任务。例如,在组织结构、产品分类或文件系统等场景中,经常需要查询这种类型的层级数据。Oracle数据库提供了强大...
递归查询基于`CONNECT BY`子句,它允许我们定义一个起始点并根据特定条件进行递归。`PRIOR`关键字用于指定当前行与父行的关系。通过这些工具,Oracle可以构建出一个层次结构,展示出数据的树状关系。 2. **基本...
Oracle数据库支持通过`CONNECT BY`和`START WITH`子句实现递归查询。递归查询通常用于处理层次结构数据,如组织结构、文件系统等。 ##### 2. WITH子句 WITH子句是Oracle SQL中的一个特性,它允许用户定义一个临时...