start with connect by prior

本文介绍Oracle SQL中使用startwith与connectbyprior语句完成递归记录的方法,适用于具有层次结构的数据表。通过具体实例展示如何形成树形结构,并进行结果过滤。
语法: 
select * from 表名 where 条件1 start with 条件2 connect by prior 当前表字段=级联表字段。
start with与 connect by prior语句完成递归记录,形成一棵树形结构,通常可以在具有层次结构的表中使用。 
start with表示开始的记录 connect by prior 指定与当前记录关联时的字段关系代码: 
--创建部门表,这是一个具有层次结构的表,子记录通过parent_id与父记录的id进行关联 
create table DEPT( ID NUMBER(9) PRIMARY KEY, --部门
  ID NAME VARCHAR2(100),--部门名称 
  PARENT_ID NUMBER(9)--父级部门ID,通过此字段与上级部门关联 ); 
向表中插入如下数据,为了使代码简单,一个部门仅具有一个下级部门


●●●从某一节点开始查询递归的记录 select * from FC_ZTREE start with ID = 1 connect by prior ID = PID
start with ID = 1表示从ID = 1的记录开始查询,向叶子的方向递归,
递归条件是ID = PID,当前记录的ID等于子记录的PID


●●●对查询结果过滤 select * from FC_ZTREE where INTRO like '%basic%' start with ID = 101 connect by prior ID = PID
首先使用start with... connect by prior查询出树形的结构,然后where条件才生效,对全部查询结果进行过滤
如果先进行where条件过滤,则过滤后的结果可能不能够成一个树结构,所以必须先查询出树才能够进行过滤
 
●●●prior的作用 prior关键字表示不进行递归查询,仅查询出满足id=1的记录,下面是将第一个查询去掉prior关键字后结果 
select * from FC_ZTREE start with ID = 101 connect by ID = PID
效果与select * from FC_ZTREE where ID = 101 相同


总结:

1)prior放在子节点端,则表示扫描树是以start with指定的节点作为根节点从上往下扫描。

可能对应一个或多个分支。

 start with可以省略,如果省略,表示对所有节点都当成根节点分别进行遍历
2)prior放在父节点端,则表示扫描树是以start with指定的节点作为最低层子节点,从下往上扫描。
顺序是子节点往父节点扫描,直到根节点为止,这种情况只能得到一个分支。
start with可以省略,如果省略,表示对所有节点都当成最低层子节点分别往根节点方向遍历
`START WITH CONNECT BY PRIOR` 是Oracle数据库中用于层次查询的语法。它用于查询具有层次结构的数据,例如树形结构或父子关系的数据。以下是一些关键点和使用示例: 1. **层次查询的基本语法**: ```sql SELECT column1, column2, ... FROM table_name START WITH condition1 CONNECT BY PRIOR condition2; ``` 2. **参数解释**: - `START WITH`:指定层次查询的起始条件,即根节点。 - `CONNECT BY PRIOR`:指定父子关系,其中`PRIOR`关键字用于引用父节点。 3. **示例**: 假设有一个表`employees`,结构如下: ```sql CREATE TABLE employees ( employee_id NUMBER, name VARCHAR2(100), manager_id NUMBER ); ``` 其中,`employee_id`是员工唯一标识,`manager_id`是其直接上级的`employee_id`。 查询所有员工及其上级关系: ```sql SELECT employee_id, name, manager_id FROM employees START WITH manager_id IS NULL CONNECT BY PRIOR employee_id = manager_id; ``` 这个查询的逻辑是:从没有上级的员工(根节点)开始,递归查找其下级员工。 4. **使用`LEVEL`伪列**: `LEVEL`伪列用于表示当前节点在层次结构中的深度。 ```sql SELECT LEVEL, employee_id, name, manager_id FROM employees START WITH manager_id IS NULL CONNECT BY PRIOR employee_id = manager_id; ``` 5. **使用`CONNECT_BY_ROOT`**: `CONNECT_BY_ROOT`用于获取根节点的值。 ```sql SELECT CONNECT_BY_ROOT name AS root_manager, employee_id, name, manager_id FROM employees START WITH manager_id IS NULL CONNECT BY PRIOR employee_id = manager_id; ``` 通过使用`START WITH CONNECT BY PRIOR`,可以方便地查询和操作具有层次结构的数据。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值