ORACLE查询树型关系(connect by prior start with)
oracle中connect_by_prior用法,实战解决日期分解问题
connect by prior 是结构化查询中用到的,其基本语法是:select ... from tablename start with 条件1connect by prior 条件2where 条件3;例:select * from tablestart with org_id = 'AAA'connect by prior org_id = parent_id;简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。
用上述语法的查询可以取得这棵树的所有记录。
其中:条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。
条件2 是连接条件,其中用PRIOR表示上一条记录,比如CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。
条件3 是过滤条件,用于对返回的所有记录进行过滤。
简单介绍如下:早扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下:第一步:从根节点开始;第二步:访问该节点;第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步;第四步:若该节点为根节点,则访问完毕,否则执行第五步;第五步:返回到该节点的父节点,并执行第三步骤。
总之:扫描整个树结构的过程也即是中序遍历树的过程。
1.树结构的描述树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述,如EMP表中的EMPNO和MGR。
EMPNO表示该雇员的编号,MGR表示领导该雇员的人的编号,即子节点的MGR值等于父节点的EMPNO值。
在表的每一行中都有一个表示父节点的MGR(除根节点外),通过每个节点的父节点,就可以确定整个树结构。
oracle查询树行结构的方法
oracle查询树行结构的方法
如果需要查询Oracle数据库中的树形结构数据,可以使用CONNECT BY 子句和 START WITH 子句来查询。
CONNECT BY 子句通常用于查询树形结构数据,而 START WITH 子句用于指定查询的根节点。
以下是一个示例查询用于查询“部门”和“员工”的树形结构数据:
```sql
SELECT d.department_name, e.employee_name
FROM departments d
LEFT JOIN employees e ON e.department_id = d.department_id START WITH d.department_id = 1 -- 指定根节点
CONNECT BY PRIOR d.department_id = d.parent_department_id; -- 指定查询父节点
```
在这个查询中,我们使用 START WITH d.department_id = 1 指定了查询的根节点为部门ID为1的部门,使用CONNECT BY PRIOR d.department_id = d.parent_department_id 指定了查询父部门的ID,然后分别查询了部门名称和员工名称。
通过这样的查询方法,就可以查询出Oracle数据库中的树形结构数据。
1/ 1。
oracle中的connectbyprior递归算法
oracle中的connectbyprior递归算法
oracle 中start with .....connect by prior ⼦句⽤法 connect by 是结构化查询中⽤到的,
其基本语法是:
select ... from 表名 start with 条件1 connect by 条件2 where 条件3;
简单的说就是讲⼀个树状结构存储在⼀张表⾥,⽐如⼀张表中存储连个字段:org_id ,parent_id那么通过表⽰每⼀条记录的⽗id是谁,就可以形成⼀个树状结构
使⽤上述语法的查询可以取得这棵树的所有记录。
其中:
条件1是根节点的限定语句,当然可以放宽限定条件,来取得多个根节点,实际就是多棵树。
条件2是链接条件,其中⽤prior表⽰上⼀条记录,⽐如connect by prior org_id = parent_id 就是说上⼀条记录的org_id 等于本记录的parent_id,即本条纪录的⽗亲是上⼀条记录。
条件3是过滤条件,⽤于对返回的所有数据进⾏过滤。
、
简单介绍如下:
在扫⾯树结构表时,需要依次访问树结构的每个节点,⼀个节点只能访问⼀次,其访问的步骤如下:
第⼀步:从根节点开始
第⼆步:访问根节点
第三步:判断该节点有⽆未被访问的⼦节点,若有,则转向他最左侧的未访问的⼦节点。
Oracle start with connect by prior 用法
语法:select *from 表名where 条件1start with 条件2connect by prior 当前表字段=级联表字段start with与connect by prior语句完成递归记录,形成一棵树形结构,通常可以在具有层次结构的表中使用。
start with表示开始的记录connect by prior 指定与当前记录关联时的字段关系代码:--创建部门表,这是一个具有层次结构的表,子记录通过parent_id与父记录的id进行关联create table DEPT(ID NUMBER(9) PRIMARY KEY, --部门IDNAME VARCHAR2(100), --部门名称PARENT_ID NUMBER(9) --父级部门ID,通过此字段与上级部门关联);向表中插入如下数据,为了使代码简单,一个部门仅具有一个下级部门●从根节点开始查询递归的记录select *from deptstart with id=1connect by prior id = parent_id; 下面是查询结果,start with id=1表示从id=1的记录开始查询,向叶子的方向递归,递归条件是id=parent_id,当前记录的id等于子记录的parent_id ●从叶子节点开始查询递归的记录select *from deptstart with id=5connect by prior parent_id = id;下面是查询结果,递归条件按照当前记录的parent_id等与父记录的id●对查询结果过滤select *from deptwhere name like '%销售%'start with id=1connect by prior id = parent_id;在下面的查询结果中可以看到,首先使用start with... connect by prior查询出树形的结构,然后where条件才生效,对全部查询结果进行过滤●prior的作用prior关键字表示不进行递归查询,仅查询出满足id=1的记录,下面是将第一个查询去掉prior关键字后结果select *from deptstart with id=1connect by prior id = parent_id;。
Oracle_树形递归
说明2、如果求002以上的节点,则“connect by prior topno=departno”,“=”两边的条件换位即可。
select departno,departname,level
from dept
connect by prior departno=topno
start with topno='002';
max(decode(t.element, 'Bi', 1, 0)) Bi,
max(decode(t.element, 'Br', 1, 0)) Br,
max(decode(t.element, 'C', 1, 0)) C,
max(decode(t.element, 'Ca', 1, 0)) Ca
insert into Dept values('002','总裁办 ','001');
insert into Dept values('003','财务部 ','001');
insert into Dept values('004','市场部 ','002');
insert into Dept values('005','公关部 ','002');
end loop;
end;
declare
v_emp emp%rowtype;
begin
select * into v_emp from emp where mgr is null;
connect by prior用法
connect by prior用法connect by prior script(connect by prior语句)是oracle中用来处理hierarchical queries类型的查询,常称为递归查询。
其基本语法格式为:select [columns]from table_namestart with [condition]connect by prior condition ;其中,start with子句用来指定根节点,connect by prior子句与它紧密相连,两者合起来称为connect by prior script,它用来查询树形结构的hierarchical queries 的查询。
有时候,connect by prior也可以称为recursive queries,它们是将根据每一行记录获取下一行记录的结果组装起来。
在尝试运用connect by prior方法来构建树状hierarchical queries类型查询时,需要设定以下几个要素:1.根节点:通过start with子句指定。
2.关联键:需要将父节点与子节点的关联键用connect by prior子句指定;3.行:一行数据一个节点,相连的行将会构建出树状hierarchical queries类型查询;4.过滤条件或者排序:可以在运用connect by prior子句之后,用where子句来指定过滤条件,以及用order by子句来指定排序。
来看一个简单的实例,如下面的表table_name:id | name | parent_id----+------+-----------1 | a1 | null2 | b2 | 13 | c3 | 24 | a4 | 1若要从上表中获取id为1的parent_id下面的子节点,运用connect by prior子句可以构建出一下hierarchical queries查询:最终返回的结果为:从上述结果可以看出,使用connect by prior子句可以得到从id为1的parent_id 下面的子节点,也就是获取根节点的直接子节点。
oracle用法集锦
oracle⽤法集锦⼀﹑ORACLE查询树型关系(connect by prior start with)connect by prior start with 经常会被⽤到⼀个表中存在递归关系的时候。
⽐如我们经常会将⼀个⽐较复杂的⽬录树存储到⼀个表中。
或者将⼀些部门存储到⼀个表中,⽽这些部门互相有⾪属关系。
这个时候你就会⽤到connect by prior start with。
典型的使⽤⽅法就是:select * from table connect by prior cur_id=parent_id start with cur_id=例如:a b1 02 13 14 25 3如果想查找a=2及其下⾯的所有数据,则:select * from table connect by prior a=b start with a=2a b2 14 2例如1﹕看成兩個集合START WITH 為條件select *from dv_bomsWHERE artic_code = '315066-001-00' AND PART_NO='00051'START WITH artic_code = '315066-001-00' and bom_ver =1AND ITEM_NO = 60 and item_no_pa is nullCONNECT BY//以下條件為⽗主鍵=⼦主鍵PRIOR artic_code = artic_code and PRIOR bom_ver = bom_ver andPRIOR item_no = item_no_pa;SELECT PART_NO,ITEM_NO,ITEM_NO_PAFROM DV_BOMSWHERE Artic_code = '315066-001-00' and bom_ver =1;AND PART_NO='00051';從那項開始找到底部關系圖select *from dv_bomsSTART WITH artic_code = '315066-001-00' and bom_ver =1 and item_no_pa ='60'CONNECT BYPRIOR artic_code = artic_code and PRIOR bom_ver = bom_ver ANDPRIOR ITEM_NO=ITEM_NO_PA;例如2﹕select distinct artic_code,(case when level = 1 then part_nowhen level = 2 then ' '||part_nowhen level = 3 then ' '||part_noend ) part_no此句也可select artic_code, lpad(' ',4*(level-1))||part_no part_no,item_no,item_no_pa from dv_boms //where artic_code = '313324-002-00'connect by prior artic_code = artic_codeand prior bom_ver = bom_verand prior item_no = item_no_pastart with artic_code = '315066-001-00'and bom_ver =1and PART_NO='00051'and item_no = 60 ---从某⼀节点开始ORDER BY part_no desc例3﹕SELECT lpad(' ',3 * level - 2) ,PART_ID ,levelFROM BOM_DETAIL_NEWWHERE PRODUCT_ID = :ls_proc_idSTART WITH PARENT_PART_ID IS NULLCONNECT BY PRIOR PART_ID = PARENT_PART_ID;例3﹕Oracle中使⽤connect by 来实现树状查询,其中可以使⽤level这个伪列来实现分层查询。
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"是递归查询中的一个伪列,表示当前行的层级。
connect by nocycle prior用法
connect by nocycle prior用法在Oracle数据库中,CONNECT BY NOCYCLE PRIOR子句是一种用于执行递归查询的方法。
它用于构建树状结构的结果集。
CONNECT BY NOCYCLE PRIOR子句必须与START WITH子句一起使用。
START WITH子句用于指定起始行,而CONNECT BY子句用于指定递归关系。
具体用法如下:1. 首先,使用START WITH子句指定起始行。
这可以是任何满足条件的行。
2. 接下来,使用CONNECT BY子句指定递归关系。
这需要指定两个列,一个是当前行的列,另一个是父级行的列。
CONNECT BY子句还可以使用其他条件来过滤结果集。
3. 如果希望避免结果中出现循环引用,可以在CONNECT BY子句之前添加NOCYCLE关键字。
这确保查询不会返回具有循环引用的行。
4. 最后,可以在SELECT语句中使用PRIOR关键字引用父级行的列。
以下是一个简单的示例:```SELECT employee_id, manager_idFROM employeesSTART WITH employee_id = 100CONNECT BY NOCYCLE PRIOR employee_id = manager_id; ```在上述示例中,我们从员工表中选择员工ID和经理ID。
我们以ID为100的员工作为起始行,并使用CONNECT BY子句指定了员工ID和经理ID的递归关系。
最后,我们使用PRIOR关键字引用父级行的员工ID。
这样就可以执行递归查询,并且结果集将包含树状结构,其中每一行都包含其父级行的信息。
使用NOCYCLE关键字可以确保结果中不会出现循环引用。
oracle树形结构层级查询之startwith....connectbyprior、le。。。
oracle树形结构层级查询之startwith....connectbyprior、le。
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常⽤到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是⼀个java程序开发者,我⼀直觉得只要精通数据库那么对于java开发你就成功了三分之⼀,本篇中主要介绍start with...connect by prior 、order by 、sys_connect_by_path。
概要:树状结构通常由根节点、⽗节点、⼦节点和叶节点组成,简单来说,⼀张表中存在两个字段,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,前⼀种写法表⽰采⽤⾃上⽽下的搜索⽅式(先找⽗节点然后找⼦节点),后⼀种写法表⽰采⽤⾃下⽽上的搜索⽅式(先找叶⼦节点然后找⽗节点)。
start with connect by prior用法
start with connect by prior用法start with connect by prior 用法是一种用于查询树形结构的Oracle SQL语句,其中用到了两个关键字start with和connect by prior。
start with是SQL语句的关键字,表示从某个节点开始查询树形结构,它必须出现在connect by prior之前。
connect by prior也是一个SQL语句的关键字,用来连接树形结构中的各个节点,表示查询从当前节点的上一级节点开始,而不是从根节点开始。
start with connect by prior用法主要用于查询树形结构数据,如组织结构、层级关系等,它能够帮助我们查询出每个节点下的所有子节点,从而快速获取组织结构中的所有员工信息、部门信息等数据。
首先,使用start with关键字来指定查询树形结构的起点,例如:SELECT * FROM t_org START WITH org_id=1 CONNECT BY PRIOR id = pid;上述语句表示从组织结构表t_org中查询org_id=1的节点开始查询,并使用connect by prior来连接树形结构中的各个节点。
然后,使用connect by prior关键字来连接各个节点,它的作用是将当前节点的上一级节点与之进行连接,并从当前节点开始查询,而不是从根节点开始查询,例如:SELECT * FROM t_org START WITH org_id=1 CONNECT BY PRIOR id = pid;上述语句表示从org_id=1的节点开始查询,并使用connect by prior来连接树形结构中的各个节点,即查询当前节点的上一级节点,直到查询出所有节点。
最后,使用order by关键字对查询结果进行排序,例如:SELECT * FROM t_org START WITH org_id=1 CONNECT BY PRIOR id = pid ORDER BY org_level;上述语句表示按照org_level字段排序,以显示最终的树形结构。
oracle 树形排序语句
oracle 树形排序语句树形排序是一种常用的排序方法,它可以将数据按照树的结构进行排列,使得数据之间的层次关系更加清晰。
在Oracle数据库中,我们可以使用CONNECT BY子句和START WITH子句来实现树形排序。
1. 使用CONNECT BY子句和START WITH子句实现树形排序的语句如下:```sqlSELECT *FROM table_nameSTART WITH parent_id IS NULLCONNECT BY PRIOR id = parent_id;```这段代码中,table_name是要进行排序的表名,parent_id是表示父节点的字段名,id是表示当前节点的字段名。
通过START WITH子句指定根节点,然后使用CONNECT BY子句指定节点之间的关系。
2. 如果要按照多个字段进行树形排序,可以在CONNECT BY子句中使用多个条件,并使用AND连接。
```sqlSELECT *FROM table_nameSTART WITH parent_id IS NULLCONNECT BY PRIOR id = parent_id AND PRIOR name = parent_name;```这段代码中,name是表示当前节点的字段名,parent_name是表示父节点的字段名。
通过多个条件进行排序,可以更加准确地表达节点之间的关系。
3. 使用LEVEL关键字可以获取当前节点在树中的层级。
```sqlSELECT id, name, LEVELFROM table_nameSTART WITH parent_id IS NULLCONNECT BY PRIOR id = parent_id;```这段代码中,LEVEL表示当前节点在树中的层级。
通过LEVEL关键字,可以对树中的节点进行分层,并在结果集中显示出来。
4. 使用CONNECT_BY_ROOT关键字可以获取根节点的值。
oracle的startwithconnectbyprior如何使用
oracle的startwithconnectbyprior如何使⽤oracle的start with connect by prior是根据条件递归查询"树",分为四种使⽤情况: 第⼀种:start with ⼦节点ID='...' connect by prior ⼦节点ID = ⽗节点IDselect * from mdm_organization o start with _code='10000008' connect by prior _code=_parent_code 按照条件org_code='10000008',对'10000008'(包括⾃⼰)及其⼦节点进⾏递归查询,结果如下查询结果⾃⼰所有的后代节点(包括⾃⼰)。
第⼆种:start with ⼦节点ID='...' connect by ⼦节点ID = prior ⽗节点IDselect * from mdm_organization o start with _code='10000008' connect by _code=prior _parent_code 按照条件org_code='10000008',对'10000008'(包括⾃⼰)及其⽗节点进⾏递归查询,结果如下 查询结果⾃⼰所有的前代节点(包括⾃⼰)。
第三种:start with ⽗节点ID='...' connect by prior ⼦节点ID = ⽗节点IDselect * from mdm_organization o start with _parent_code='10000008' connect by prior _code=_parent_code 按照条件org_parent_code='10000008',对'10000008'(不包括⾃⼰)⼦节点进⾏递归查询,结果如下 查询结果⾃⼰所有的后代节点(不包括⾃⼰)。
start with connect by prior快速简单理解 -回复
start with connect by prior快速简单理解-回复Connect by prior 是Oracle 数据库中使用的一种递归查询方法,主要用于创建层次结构的查询。
在数据库中,数据可以以层次结构的形式组织,每个节点可以与一个或多个子节点相关联。
使用Connect by prior,我们可以根据父节点和子节点之间的关联关系快速查询出这种层次结构。
在本文中,我将逐步解释Connect by prior 的用法及其在数据库查询中的应用。
首先,让我们来了解一下Connect by prior 的语法。
它的基本形式如下:SELECT columnsFROM tableWHERE conditionCONNECT BY PRIOR parent_column = child_column;其中,columns 表示要查询的列,table 是要查询的表,condition 是查询的条件,parent_column 是父节点列,child_column 是子节点列。
在开始之前,我们需要创建一个示例表来演示Connect by prior 的用法。
假设我们有一个名为employees 的表,其中包含员工的ID 和上级的ID。
我们可以使用以下语句创建这个表:CREATE TABLE employees (employee_id NUMBER,manager_id NUMBER,employee_name VARCHAR2(100));接下来,我们插入一些示例数据:INSERT INTO employees VALUES (1, NULL, 'John');INSERT INTO employees VALUES (2, 1, 'Tom');INSERT INTO employees VALUES (3, 1, 'Jane');INSERT INTO employees VALUES (4, 2, 'Bob');INSERT INTO employees VALUES (5, 2, 'Alice');INSERT INTO employees VALUES (6, 3, 'Mike');现在让我们开始使用Connect by prior 来查询这个表。
oracle中start with connect by prior and prior 的用法
oracle中start with connect by prior and prior
的用法
start with 和connect by prior子句是伪列循环构造树形结构(树形查询)时常用的关键字,它们一般配合使用,用于操作有层次结构(hierarchical structure)的表中的数据,比如说机构、部门等等。
start with用于定义树形查询的根节点:
例如:
SELECT employee_id, last_name
FROM employees
START WITH employee_id = 1000
CONNECT BY PRIOR employee_id = manager_id;
上面的SQL语句查询了以id为1000为根节点的职员树:即id为1000的员工以及他的所有下属.
connect by prior 用于上一级和下一级之间建立关联:
CONNECT BY PRIOR,PRIOR标识上一级,上一级节点上可以有多个下一级节
点。
例如:
SELECT project_id, project_name
FROM projects
START WITH project_id = 1000
CONNECT BY PRIOR parent_project_id = project_id;
执行这条SQL,查询了以id为1000为根节点的项目树:即id为1000的项目以及项目中所有的子项目。
start with…connect by prior子句用法
其中:
条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。
条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id;就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。
在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。
START WITH:不但可以指定一个根节点,还可以指定多个根节点。
2.关于PRIOR
3.定义查找起始节点
在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。
4.使用LEVEL
在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。图1.2就表示了树结构的层次。
PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如:
CONNECT BY EMPNO=PRIOR MGR
在这种方式中也应指定一个开始的节点。
运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。
PRIOR被置于CONNECT BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如:
ORACLE查询树型关系(connect_by_prior_start_with)
return outnum;
end f_digit_add;
/
select f_digit_add(123456) from dual;
/**********************************************************************************
insert into test values('12','121');
insert into test values('12','122');
insert into test values('21','211');
insert into test values('21','212');
(usually some sort of parent->child, boss->employee or thing->parts).
It is also being used when an sql execution plan is explained.
syntax:
select ... [start with initial-condition] connect by [nocycle] recurse-condition
--创建测试表,增加测试数据
create table test(superid varchar2(20),id varchar2(20));
insert into test values('0','1');
oracle树形查询startwithconnectby
oracle树形查询startwithconnectby⼀、简介 在oracle中start with connect by (prior) ⽤来对树形结构的数据进⾏查询。
其中start with conditon 给出的是数据搜索范围, connect by后⾯给出了递归查询的条件,prior 关键字表⽰⽗数据,prior 条件表⽰⼦数据需要满⾜⽗数据的什么条件。
如下start with id= '10001' connect by prior parent_id= id and prior num = 5表⽰查询id为10001,并且递归查询parent_id=id,为5的记录。
⼆、实例 1、构造数据1-- 表结构2create table menu(3 id varchar2(64) not null,4 parent_id varchar2(64) not null,5 name varchar2(100) not null,6 depth number(2) not null,7primary key (id)8 )910-- 初始化数据11-- 顶级菜单12insert into menu values ('100000', '0', '顶级菜单1', 1);13insert into menu values ('200000', '0', '顶级菜单2', 1);14insert into menu values ('300000', '0', '顶级菜单3', 1);1516-- ⽗级菜单17-- 顶级菜单1 直接⼦菜单18insert into menu values ('110000', '100000', '菜单11', 2);19insert into menu values ('120000', '100000', '菜单12', 2);20insert into menu values ('130000', '100000', '菜单13', 2);21insert into menu values ('140000', '100000', '菜单14', 2);22-- 顶级菜单2 直接⼦菜单23insert into menu values ('210000', '200000', '菜单21', 2);24insert into menu values ('220000', '200000', '菜单22', 2);25insert into menu values ('230000', '200000', '菜单23', 2);26-- 顶级菜单3 直接⼦菜单27insert into menu values ('310000', '300000', '菜单31', 2);2829-- 菜单13 直接⼦菜单30insert into menu values ('131000', '130000', '菜单131', 3);31insert into menu values ('132000', '130000', '菜单132', 3);32insert into menu values ('133000', '130000', '菜单133', 3);3334-- 菜单132 直接⼦菜单35insert into menu values ('132100', '132000', '菜单1321', 4);36insert into menu values ('132200', '132000', '菜单1332', 4);37 ⽣成的菜单层次结构如下:顶级菜单1菜单11菜单12菜单13菜单131菜单132菜单1321菜单1322菜单133菜单14顶级菜单2菜单21菜单22菜单23顶级菜单3菜单31 2、SQL查询--prior放的左右位置决定了检索是⾃底向上还是⾃顶向下. 左边是⾃上⽽下(找⼦节点),右边是⾃下⽽上(找⽗节点)--找⽗节点select*from menu start with id='130000' connect by id = prior parent_id;--找⼦节点节点-- (⼦节点)id为130000的菜单,以及130000菜单下的所有直接或间接⼦菜单(prior 在左边, prior、parent_id(等号右边)在右边)select*from menu start with id='130000' connect by prior id = parent_id ;-- (⽗节点)id为1321的菜单,以及1321菜单下的所有直接或间接⽗菜单(prior、parent_id(等号左边) 都在左边)select*from menu start with id='132100' connect by prior parent_id = id;-- prior 后⾯跟的是(parent_id) 则是查找⽗节点,prior后⾯跟的是(id)则是查找⼦节点--根据菜单组分类统计每个菜单包含⼦菜单的个数select id, max(name) name, count(1) from menugroup by idconnect by prior parent_id = idorder by id-- 查询所有的叶⼦节点select t2.*from menu t2 where id not in(select t.parent_id from menu t) order by id;三、性能问题 对于 start with connect by语句的执⾏,oracle会进⾏递归查询,当数据量⼤的时候会产⽣性能相关问题。
oracle中connect by的用法
oracle中connect by的用法Oracle数据库中,Connect By语句是一种递归查询的形式,它可以将一个表中的记录按照树形结构进行展示。
在Connect By语句中,可以使用Start With来指定查询的根节点,使用Connect By Prior来指定查找子节点的条件。
Connect By语句的语法是:SELECT column1, column2, … FROM table_nameSTART WITH conditionCONNECT BY [NOCYCLE] PRIOR column1 = column2;其中,column1和column2是条件列,table_name 是查询表名,condition是查询条件,START WITH是起始条件,CONNECT BY是递归条件。
在Connect By语句中,可以使用NOCYCLE关键字来避免出现循环引用的情况。
当查询的表中出现环形结构时,如果没有NOCYCLE关键字,就会出现死循环,程序会一直递归下去,程序就会崩溃。
以下是一个使用Oracle的Connect By语句查询员工关系的例子:SELECT empno, ename, mgrFROM empSTART WITH empno = 7839CONNECT BY PRIOR empno = mgr;在这个例子中,我们查询员工表中empno为7839的员工的上级领导和下级员工。
首先,使用START WITH语句从7839开始,然后根据员工编号和上级编号建立关系。
在Connect By Prior中,我们使用empno = mgr来指定子节点的查找条件。
这意味着,对于当前记录中的empno,我们要找到与它相等的mgr,然后再次查询子节点。
这个过程会一直持续下去,直到查询到所有子节点。
最后,我们可得到一个树形结构的员工关系。
总之,使用Oracle的Connect By语句,我们可以轻松地查询出具有树形结构的表,使结果以树形结构呈现,这对于数据库查询、分析和管理是非常有帮助的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
connect by prior start with语句详解通过START WITH . . . CONNECT BY . . .子句来实现SQL的层次查询.自从Oracle 9i开始,可以通过 SYS_CONNECT_BY_PATH 函数实现将父节点到当前行内容以“path”或者层次元素列表的形式显示出来。
自从Oracle 10g 中,还有其他更多关于层次查询的新特性。
例如,有的时候用户更关心的是每个层次分支中等级最低的内容。
那么你就可以利用伪列函数CONNECT_BY_ISLEAF来判断当前行是不是叶子。
如果是叶子就会在伪列中显示“1”,如果不是叶子而是一个分支(例如当前内容是其他行的父亲)就显示“0”。
在Oracle 10g 之前的版本中,如果在你的树中出现了环状循环(如一个孩子节点引用一个父亲节点),Oracle 就会报出一个错误提示:“ ORA-01436: CONNECT BY loop in user data”。
如果不删掉对父亲的引用就无法执行查询操作。
而在 Oracle 10g 中,只要指定“NOCYCLE”就可以进行任意的查询操作。
与这个关键字相关的还有一个伪列——CONNECT_BY_ISCYCLE,如果在当前行中引用了某个父亲节点的内容并在树中出现了循环,那么该行的伪列中就会显示“1”,否则就显示“0”。
The start with .. connect by clause can be used to select data that has a hierarchical relationship(usually some sort of parent->child, boss->employee or thing->parts).It is also being used when an sql execution plan is explained.syntax:select ... [start with initial-condition] connect by [nocycle] recurse-conditionlevelWith level it is possible to show the level in the hierarchical relation of all the data.--oracle 9isys_connect_by_pathWith sys_connect_by_path it is possible to show the entire path from the top level down to the 'actual' child.--oracle 10gconnect_by_rootconnect_by_root is a new operator that comes with Oracle 10g and enhances the ability to perform hierarchical queries.connect_by_is_leafconnect_by_isleaf is a new operator that comes with Oracle 10g and enhances the ability to perform hierarchical queries.connect_by_iscycleconnect_by_is_cycle is a new operator that comes with Oracle 10g and enhances the ability to perform hierarchical queries.--start with ... connect by ... 的处理机制How must a start with ... connect by select statement be read and interpreted? If Oracle encounters such an SQL statement, it proceeds as described in the following pseude code.for rec in (select * from some_table) loopif FULLFILLS_START_WITH_CONDITION(rec) thenRECURSE(rec, rec.child);end if;end loop;procedure RECURSE (rec in MATCHES_SELECT_STMT, new_parent IN field_type) is beginAPPEND_RESULT_LIST(rec);for rec_recurse in (select * from some_table) loopif FULLFILLS_CONNECT_BY_CONDITION(rec_recurse.child, new_parent) thenRECURSE(rec_recurse,rec_recurse.child);end if;end loop;end procedure RECURSE;created by zhouwf0726 2006.*******************************************************************************/--创建测试表,增加测试数据create table test(superid varchar2(20),id varchar2(20));insert into test values('0','1');insert into test values('0','2');insert into test values('1','11');insert into test values('1','12');insert into test values('2','21');insert into test values('2','22');insert into test values('11','111');insert into test values('11','112');insert into test values('12','121');insert into test values('12','122');insert into test values('21','211');insert into test values('21','212');insert into test values('22','221');insert into test values('22','222');commit;--层次查询示例select level||'层',lpad(' ',level*5)||id idfrom teststart with superid = '0' connect by prior id=superid;select level||'层',connect_by_isleaf,lpad(' ',level*5)||id idfrom teststart with superid = '0' connect by prior id=superid;--给出两个以前在"数据库字符串分组相加之四"中的例子来理解start with ... connect by ...--功能:实现按照superid分组,把id用";"连接起来--实现:以下两个例子都是通过构造2个伪列来实现connect by连接的。
/*------method one------*/select superid,ltrim(max(sys_connect_by_path(id,';')),';') from(select superid,id,row_number() over(partition by superid order by superid) id1, row_number() over(order by superid) + dense_rank() over(order by superid) id2 from test)start with id1=1 connect by prior id2 = id2 -1group by superid order by superid;/*------method two------*/select distinct superid,ltrim(first_value(id) over(partition by superid order by l desc),';')from(select superid,level l,sys_connect_by_path(id,';') idfrom(select superid,id,superid||rownum parent_rn,superid||to_char(rownum-1) rnfrom test)connect by prior parent_rn = rn);--下面的例子实现把一个整数的各个位上的数字相加,通过这个例子我们再次理解connect by.create or replace function f_digit_add(innum integer) return numberisoutnum integer;beginif innum<0 thenreturn 0;end if;select sum(nm) into outnum from(select substr(innum,rownum,1) nm from dual connect by rownum<length(innum));return outnum;end f_digit_add;/select f_digit_add(123456) from dual;/******************************************************************************* *********************************************************************************** ***下面是关于SQL解决有向图问题,在这个例子中作者提到的错误select * from fares connect by prior arrive = depart start with depart = 'LHR'; ERROR:ORA-01436: CONNECT BY loop in user data在oracle10g以上版本可以利用connect by的nocycle参数来解。