oracle 递归查询

connect by 是结构化查询中用到的,其基本语法是:
select ... from tablename start by cond1
connect by cond2
where cond3;
简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: id,parentid那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。

用上述语法的查询可以取得这棵树的所有记录。

其中COND1是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。

COND2是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR
ID=PRAENTID就是说上一条记录的ID是本条记录的PRAENTID,即本记录的父亲是上一条记录。

COND3是过滤条件,用于对返回的所有记录进行过滤。

PRIOR和START WITH关键字是可选项
PRIORY运算符必须放置在连接关系的两列中某一个的前面。

对于节点间的父子关系,PRIOR
运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是
自底向上。

在连接关系中,除了可以使用列名外,还允许使用列表达式。

START WITH 子句为
可选项,用来标识哪个节点作为查找树型结构的根节点。

若该子句被省略,则表示所有满足查询
条件的行作为根节点。

完整的例子如SELECT PID,ID,NAME FROM T_WF_ENG_WFKIND START WITH PID =0 CONNECT BY PRIOR ID = PID
以上主要是针对上层对下层的顺向递归查询而使用start with ... connect by prior ...这种方式,但有时在需求需要的时候,可能会需要由下层向上层的逆向递归查询,此是语句就有所变化:例如要实现 select * from table where id in ('0','01','0101','0203','0304') ;现在想把0304的上一级03给递归出
来,0203的上一级02给递归出来,而01现在已经是存在的,最高层为0.而这张table不仅仅这些数据,但我现在只需要
('0','01','0101','0203','0304','02','03')这些数据,此时语句可以这样写SELECT PID,ID,NAME FROM V_WF_WFKIND_TREE WHERE ID IN (SELECT DISTINCT(ID) ID FROM V_WF_WFKIND_TREE CONNECT BY PRIOR PID = ID START WITH ID IN ('0','01','0101','0203','0304') );
其中START WITH ID IN里面的值也可以替换SELECT 子查询语句.
注意由上层向下层递归与下层向上层递归的区别在于START WITH...CONNECT BY PRIOR...的先后顺序以及 ID = PID 和 PID = ID 的微小变化!
实例:
创建示例表:
CREATE TABLE TBL_TEST
(
ID NUMBER,
NAME VARCHAR2(100 BYTE),
PID NUMBER DEFAULT 0
);
插入测试数据:
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
从Root往树末梢递归
select * from TBL_TEST
start with id=1
connect by prior id = pid
从末梢往树ROOT递归
select * from TBL_TEST
start with id=5
connect by prior pid = id
===================================================================== ==========================================
有一张表 t
字段:
parent
child
两个字段的关系是父子关系
写一个sql语句,查询出指定父下面的所有的子
比如
a b
a c
a e
b b1
b b2
c c1
e e1
e e3
d d1
指定parent=a,选出
a b
a c
a e
b b1
b b2
c c1
e e1
e e3
SQL语句:
select parent,child from test start with parent='a' connect by prior child=parent。

合集下载

oracle 递归查询语句

oracle 递归查询语句

oracle 递归查询语句摘要:1.Oracle 递归查询语句的概念和原理2.Oracle 递归查询语句的编写方法3.Oracle 递归查询语句的应用实例4.Oracle 递归查询语句的性能优化正文:【1.Oracle 递归查询语句的概念和原理】Oracle 递归查询语句是一种特殊类型的SQL 查询语句,它可以使数据库自动执行一系列自我调用的操作,以便查找满足特定条件的所有记录。

递归查询语句在Oracle 数据库中有着广泛的应用,例如,用于查询具有复杂层级关系的数据、实现树形结构的数据查询等。

递归查询的原理是利用公共表表达式(CTE)来实现自我调用。

公共表表达式是Oracle 数据库中一种新的查询技术,允许用户创建一个临时的结果集,并在查询过程中对其进行操作。

递归查询语句通过在CTE 中定义一个递归操作,使得查询可以自动地调用自身,以查找满足条件的所有记录。

【2.Oracle 递归查询语句的编写方法】要编写一个Oracle 递归查询语句,需要遵循以下步骤:1.首先,确定查询的目标。

例如,查询一个具有复杂层级关系的数据表中的所有记录。

2.其次,创建一个公共表表达式(CTE)。

在CTE 中,定义一个递归操作,即使用CTE 自身作为查询的输入。

3.接着,编写主查询语句。

在主查询语句中,使用CTE 作为查询的基表,并添加筛选条件,以满足查询的目标。

4.最后,优化查询语句。

为了提高查询的性能,可以对查询语句进行优化,例如,增加索引、减少查询范围等。

下面是一个Oracle 递归查询语句的示例:```sqlWITH RECURSIVE tree AS (-- 基本情况:选取根节点SELECT id, name, levelFROM treeWHERE level = 0UNION ALL-- 递归情况:选取下一层节点SELECT t.id, , t.level + 1FROM tree tJOIN tree tr ON t.id = tr.parent_id)SELECT * FROM tree;```【3.Oracle 递归查询语句的应用实例】Oracle 递归查询语句在实际应用中有很多实例,下面是一个查询员工部门层级关系的例子:```sqlWITH RECURSIVE department AS (-- 基本情况:选取部门根节点SELECT id, name, levelFROM departmentWHERE level = 0UNION ALL-- 递归情况:选取下一层节点SELECT d.id, , d.level + 1FROM department dJOIN department dr ON d.id = dr.parent_id)SELECT * FROM department;```【4.Oracle 递归查询语句的性能优化】虽然递归查询语句可以实现复杂的查询需求,但它们可能导致性能下降。

oracle中的prior用法

oracle中的prior用法

一、概述Oracle中的prior关键字是一种用于处理树形结构数据的特殊语法,它常常用于对自身表进行递归查询,或者在连接查询中使用。

在实际应用中,prior关键字的使用可以帮助我们快速有效地处理复杂的数据结构,并且提高查询效率。

二、递归查询1. prior关键字在递归查询中的使用在处理树形结构数据时,通常需要进行递归查询以获取整个树的数据。

这时,prior关键字就可以派上用场了。

通过在查询语句中使用prior关键字,我们可以实现从父节点向子节点的递归查询,轻松地获取整个树形结构的数据。

2. 使用prior关键字实现递归查询的示例我们有一个部门表,表中包含部门ID和上级部门ID两个字段。

如果我们想要查询某个部门及其所有下属部门的信息,可以使用prior关键字来实现递归查询。

示例代码如下:```sqlselect *from departmentstart with department_id = :dept_idconnect by prior department_id = parent_department_id;```以上代码中,我们通过start with指定了起始部门ID,然后通过connect by prior指定了递归关系,从而实现了部门及其所有下属部门的查询。

三、连接查询1. prior关键字在连接查询中的使用除了在递归查询中的应用,prior关键字还可以在连接查询中发挥作用。

通过在连接查询中使用prior关键字,我们可以实现对历史数据的查询、版本间的比较等功能,极大地丰富了数据查询的灵活性和功能性。

2. 使用prior关键字实现连接查询的示例假设我们有一个员工表,表中包含员工ID、入职日期和离职日期等字段。

如果我们想要查询某个员工在入职后的所有薪资记录,可以使用prior关键字来实现连接查询。

示例代码如下:```sqlselect *from salary_historywhere employee_id = :emp_idand salary_date > (select hire_date from employees where employee_id = :emp_id)start with salary_date = hire_dateconnect by prior salary_date = prior_salary_date;```在以上示例中,我们通过start with和connect by prior关键字,实现了对员工在入职后所有薪资记录的查询,从而满足了具体业务需求。

Oracle递归查询sql

Oracle递归查询sql

Oracle递归查询sqlSELECT * FROM SYS_AREABASESTART WITH areacode='433127'CONNECT BY PRIOR areacode=PARENTcode1.树结构的描述树结构的数据存放在表中,数据之间的层次关系即⽗⼦关系,通过表中的列与列间的关系来描述,如EMP表中的EMPNO和MGR。

EMPNO表⽰该雇员的编号,MGR表⽰领导该雇员的⼈的编号,即⼦节点的MGR值等于⽗节点的EMPNO值。

在表的每⼀⾏中都有⼀个表⽰⽗节点的MGR(除根节点外),通过每个节点的⽗节点,就可以确定整个树结构。

在SELECT命令中使⽤CONNECT BY 和START WITH ⼦句可以查询表中的树型结构关系。

其命令格式如下:SELECT . . .CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 裂名2}[START WITH];其中:CONNECT BY⼦句说明每⾏数据将是按层次顺序检索,并规定将表中的数据连⼊树型结构的关系中。

PRIOR运算符必须放置在连接关系的两列中某⼀个的前⾯。

对于节点间的⽗⼦关系,PRIOR运算符在⼀侧表⽰⽗节点,在另⼀侧表⽰⼦节点,从⽽确定查找树结构是的顺序是⾃顶向下还是⾃底向上。

在连接关系中,除了可以使⽤列名外,还允许使⽤列表达式。

START WITH ⼦句为可选项,⽤来标识哪个节点作为查找树型结构的根节点。

若该⼦句被省略,则表⽰所有满⾜查询条件的⾏作为根节点。

START WITH:不但可以指定⼀个根节点,还可以指定多个根节点。

2.关于PRIOR运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。

PRIOR被置于CONNECT BY⼦句中等号的前⾯时,则强制从根节点到叶节点的顺序检索,即由⽗节点向⼦节点⽅向通过树结构,我们称之为⾃顶向下的⽅式。

如:CONNECT BY PRIOR EMPNO=MGRPIROR运算符被置于CONNECT BY ⼦句中等号的后⾯时,则强制从叶节点到根节点的顺序检索,即由⼦节点向⽗节点⽅向通过树结构,我们称之为⾃底向上的⽅式。

oracle递归查询start with connect by prior的用法

oracle递归查询start with connect by prior的用法

oracle递归查询start with connect by prior的用法在Oracle数据库中,"START WITH"和"CONNECT BY PRIOR"是用于执行递归查询的关键字。

这些关键字与"SELECT"语句一起使用,用于在以层次结构组织的数据中进行深度优先搜索。

具体用法如下所示:1. 使用"START WITH"关键字指定递归查询的起始条件。

例如,如果要从员工表中查询所有直接报告给经理ID为100的员工,可以这样写:```SELECT employee_id, employee_nameFROM employeeSTART WITH manager_id = 100;```2. 使用"CONNECT BY PRIOR"关键字指定递归查询的连接条件。

它指定了当前行与上一行之间的关系。

例如,可以将上述查询修改为查询经过多层级关系的员工:```SELECT employee_id, employee_nameFROM employeeSTART WITH manager_id = 100CONNECT BY PRIOR employee_id = manager_id;```在这个例子中,"PRIOR employee_id = manager_id"指定了下一层级的员工与上一层级的经理之间的连接关系。

3. 使用其他"WHERE"子句对查询结果进行筛选。

例如,可以添加"WHERE"子句限制只返回特定层级的员工:```SELECT employee_id, employee_nameFROM employeeSTART WITH manager_id = 100CONNECT BY PRIOR employee_id = manager_idWHERE LEVEL <= 3;```在这个例子中,"LEVEL"是递归查询中的一个伪列,表示当前行的层级。

oracle 递归查询优化的方法

oracle 递归查询优化的方法

oracle 递归查询优化的方法Oracle数据库是一种常用的关系型数据库管理系统,具有强大的查询功能。

在实际开发中,我们经常会遇到需要递归查询的情况,即查询某个节点的所有子节点或祖先节点。

然而,递归查询往往会涉及到大量的数据和复杂的逻辑,导致查询效率低下。

因此,本文将介绍一些优化递归查询的方法,以提高查询效率。

1. 使用CONNECT BY子句进行递归查询Oracle提供了CONNECT BY子句来支持递归查询。

通过使用CONNECT BY子句,我们可以轻松地实现递归查询,例如查询某个员工及其所有下属员工的信息。

CONNECT BY子句的基本语法如下:```SELECT 列名FROM 表名START WITH 条件CONNECT BY PRIOR 列名 = 列名;```其中,START WITH子句用于指定递归查询的起始节点,CONNECT BY PRIOR子句用于指定递归查询的连接条件。

通过合理设置起始节点和连接条件,我们可以实现不同类型的递归查询。

2. 使用层次查询优化递归查询在递归查询中,我们经常会遇到多层递归查询的情况,即查询某个节点的所有子节点及其子节点的子节点。

这时,可以使用层次查询来优化递归查询。

层次查询是一种特殊的递归查询,通过使用LEVEL伪列可以获取每个节点的层次信息。

例如,我们可以使用以下语句查询某个员工及其所有下属员工的信息及其层次信息:```SELECT 列名, LEVELFROM 表名START WITH 条件CONNECT BY PRIOR 列名 = 列名;```通过使用LEVEL伪列,我们可以方便地获取每个节点的层次信息,从而更好地理解查询结果。

3. 使用递归子查询优化递归查询在某些情况下,使用CONNECT BY子句可能会导致查询效率低下,特别是在处理大量数据时。

这时,可以考虑使用递归子查询来优化递归查询。

递归子查询是一种特殊的子查询,通过使用WITH子句和递归关键字来实现递归查询。

oracle 递归查询逻辑

oracle 递归查询逻辑

oracle 递归查询逻辑Oracle是一种关系型数据库管理系统,它提供了一种强大的递归查询功能,可以在查询语句中使用递归查询逻辑来实现复杂的数据查询和处理操作。

本文将详细介绍Oracle中递归查询的原理和使用方法。

递归查询是一种通过重复应用查询语句来解决复杂问题的方法。

在Oracle中,递归查询可以通过使用WITH语句和CONNECT BY子句来实现。

WITH语句用于定义一个或多个临时表,而CONNECT BY子句则用于指定递归查询的条件和连接关系。

我们先来了解一下WITH语句的使用方法。

WITH语句可以将一个或多个查询块定义为一个临时表,这些查询块可以在后续的查询语句中引用。

使用WITH语句可以提高查询语句的可读性和维护性,同时还可以避免重复执行相同的子查询。

WITH语句的语法如下:```WITH 表名 (列名1, 列名2, ...) AS (查询语句1UNION ALL查询语句2UNION ALL...查询语句n)```其中,表名是临时表的名称,列名1、列名2等是临时表的列名,查询语句1、查询语句2等是定义临时表的查询语句。

接下来,我们来看一下CONNECT BY子句的使用方法。

CONNECT BY 子句用于指定递归查询的条件和连接关系。

在递归查询中,每个查询块都必须包含一个起始条件和一个递归条件,起始条件用于指定递归查询的起始节点,而递归条件则用于指定递归查询的连接关系。

CONNECT BY子句的语法如下:```SELECT 列名1, 列名2, ...FROM 表名START WITH 起始条件CONNECT BY 递归条件```其中,列名1、列名2等是要查询的列名,表名是要查询的表名,起始条件用于指定递归查询的起始节点,递归条件用于指定递归查询的连接关系。

在使用递归查询时,我们需要注意一些重要的事项。

首先,递归查询必须包含一个终止条件,以避免无限递归。

其次,递归查询可能会导致性能问题,特别是在处理大量数据时。

Oracle 的递归查询

Oracle 的递归查询:1. 从上级递归查下级Java代码1.select * from tbl_test start with id = ? connect by prior id = pid2.从下级递归查上级Java代码1.select * from tbl_test start with id= ? connect by priorpid = id3. 两表连接递归查询在这里假设有两张表,部门表(tbl_department)和员工表(tbl_employee)根据指定的部门ID,查询所有该部门的员工及子部门的员工Java代码1.select emp.*, dept_name from tbl_employee emp, tbl_department dept2. where emp.dept_id = dept.id and3.( emp.dept_id = ? or emp.dept_id in4.( select a.id from tbl_department a5.start with a.id = ? connect by prior a.id = a.upper_id ) )6.order by emp.idDEPTID PAREDEPTID NAMENUMBER NUMBER CHAR (40 Byte)部门id 父部门id(所属部门id) 部门名称通过子节点向根节点追朔.select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid通过根节点遍历子节点.select * from persons.dept start with paredeptid=0 connect by prior deptid=paredept id可通过level 关键字查询所在层次.select a.*,level from persons.dept a start with paredeptid=0 connect by prior depti d=paredeptid再次复习一下:start with ...connect by 的用法, start with 后面所跟的就是就是递归的种子。

oracle递归函数

Oracle递归函数在Oracle数据库中,递归函数是一种特殊的函数类型,它允许函数调用自身以解决复杂的问题。

递归函数通常在处理树形结构、图形结构或层次结构等具有递归性质的数据时非常有用。

通过使用递归函数,我们可以减少代码的复杂性并提高查询的效率。

创建递归函数要创建一个递归函数,我们首先需要创建一个普通的函数,并在函数体内部调用自身。

下面是创建递归函数的一般步骤:1.使用 CREATE OR REPLACE FUNCTION 语句来创建一个函数。

2.指定函数的名称和参数。

3.在函数体内部添加递归终止条件,以防止无限递归。

4.编写处理递归调用的代码逻辑。

5.在函数的结尾处返回结果。

下面是一个计算斐波那契数列的递归函数的示例:CREATE OR REPLACE FUNCTION fibonacci(n NUMBER) RETURN NUMBER ISBEGIN-- 递归终止条件IF n =0THENRETURN0;ELSIF n =1THENRETURN1;ELSE-- 递归调用RETURN fibonacci(n -1) + fibonacci(n -2);END IF;END;/在上面的示例中,函数fibonacci接受一个数值参数n,并返回斐波那契数列中第n个数。

如果n的值为 0 或 1,函数将直接返回相应的结果。

否则,函数将通过调用自身来计算结果。

使用递归函数创建递归函数之后,我们可以像使用任何其他函数一样使用它。

下面是使用上述示例中的递归函数计算斐波那契数的示例:SELECT fibonacci(10) AS result FROM dual;以上查询将返回斐波那契数列中第 10 个数的值作为结果。

递归函数可以作为查询中的计算字段、过滤条件或排序依据等使用。

在使用递归函数时,我们需要注意潜在的性能问题。

由于递归函数可能会产生大量的递归调用,因此在处理大量数据时应谨慎使用。

递归函数的限制Oracle数据库中的递归函数受到一些限制。

Oracle树形结构查询(递归)

Oracle树形结构查询(递归)oracle树状结构查询即层次递归查询,是sql语句经常⽤到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的。

概要:树状结构通常由根节点、⽗节点、⼦节点和叶节点组成,简单来说,⼀张表中存在两个字段,dept_id,par_dept_id,那么通过找到每⼀条记录的⽗级id即可形成⼀个树状结构,也就是par_dept_id(⼦)=dept_id(⽗),通俗的说就是这条记录的par_dept_id是另外⼀条记录也就是⽗级的dept_id,其树状结构层级查询的基本语法是: SELECT [LEVEL],* FEOM table_name START WITH 条件1 CONNECT BY PRIOR 条件2 WHERE 条件3 ORDER BY 排序字段 说明:LEVEL---伪列,⽤于表⽰树的层次 条件1---根节点的限定条件,当然也可以放宽权限,以获得多个根节点,也就是获取多个树 条件2---连接条件,⽬的就是给出⽗⼦之间的关系是什么,根据这个关系进⾏递归查询 条件3---过滤条件,对所有返回的记录进⾏过滤。

排序字段---对所有返回记录进⾏排序 对prior说明:要的时候有两种写法:connect by prior dept_id=par_dept_id 或 connect by dept_id=prior par_dept_id,前⼀种写法表⽰采⽤⾃上⽽下的搜索⽅式(先找⽗节点然后找⼦节点),后⼀种写法表⽰采⽤⾃下⽽上的搜索⽅式(先找叶⼦节点然后找⽗节点)。

树状结构层次化查询需要对树结构的每⼀个节点进⾏访问并且不能重复,其访问步骤为: ⼤致意思就是扫描整个树结构的过程即遍历树的过程,其⽤语⾔描述就是: 步骤⼀:从根节点开始; 步骤⼆:访问该节点; 步骤三:判断该节点有⽆未被访问的⼦节点,若有,则转向它最左侧的未被访问的⼦节,并执⾏第⼆步,否则执⾏第四步; 步骤四:若该节点为根节点,则访问完毕,否则执⾏第五步; 步骤五:返回到该节点的⽗节点,并执⾏第三步骤。

Oracle递归查询与常用分析函数

Oracle递归查询与常⽤分析函数 最近学习oracle的⼀些知识,发现⾃⼰sql还是很薄弱,需要继续学习,现在总结⼀下哈。

(1)oracle递归查询 start with ... connect by prior ,⾄于是否向上查询(根节点)还是向下查询(叶节点),主要看prior后⾯跟的字段是否是⽗ID。

向上查询:select * from test_tree_demo start with id=1 connect by prior pid=id 查询结果: 向下查询:select * from test_tree_demo start with id=3 connect by prior id=pid 如果要进⾏过滤,where条件不能放在connect by 后⾯,如下:select * from test_tree_demo where id !=4 start with id=1 connect by prior pid=id (2)分析函数- over( partition by ) 数据库中的数据如下:select * from testemp1 select deptno,ename,sal,sum(sal)over() deptsum from testemp1 如果over中不加任何条件,就相当于sum(sal),显⽰结果如下: ⼀般over都是配合partition by order by ⼀起使⽤,partition by 就是分组的意思。

下⾯看个例⼦:按部门分组,同个部门根据姓名进⾏⼯资累计求和。

select deptno,ename,sal,sum(sal)over(partition by deptno order by ename) deptsum from testemp1,显⽰如下: 其实统计各个部门的薪⽔总和,可以使⽤group by实现,select deptno,sum(sal) deptsum from testemp1 group by deptno,结果如下: 但是,使⽤group by 的时候查询出来的字段必须是分组的字段或者聚合函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档