oracle connect by详解

1、作用:

用于存在父子,祖孙,上下级等层级关系的数据表进行层级查询。

2、语法

SELECT ... 
FROM ....
START WITH cond1 
CONNECT BY cond2
WHERE cond3;

2.1、说明

start with: 指定起始节点的条件

connect by: 指定父子行的条件关系

prior: 查询父行的限定符,格式: prior column1 = column2 or column1 = prior column2 and … ,

nocycle: 若数据表中存在循环行,那么不添加此关键字会报错,添加关键字后,便不会报错,但循环的两行只会显示其中的第一条

循环行: 该行只有一个子行,而且子行又是该行的祖先行

connect_by_iscycle: 前置条件:在使用了nocycle之后才能使用此关键字,用于表示是否是循环行,0表示否,1 表示是

connect_by_isleaf: 是否是叶子节点,0表示否,1 表示是

level: level伪列,表示层级,值越小层级越高,level=1为层级最高节点

3、构造数据

-- 创建表
create table employee(emp_id number(18),lead_id number(18),emp_name varchar2(200),salary number(10,2),dept_no varchar2(8)
);-- 添加数据
insert into employee values('1',0,'king','1000000.00','001');
insert into employee values('2',1,'jack','50500.00','002');
insert into employee values('3',1,'arise','60000.00','003');
insert into employee values('4',2,'scott','30000.00','002');
insert into employee values('5',2,'tiger','25000.00','002');
insert into employee values('6',3,'wudde','23000.00','003');
insert into employee values('7',3,'joker','21000.00','003');

在这里插入图片描述

4、查询jack下的所有子节点

select * from employee start with emp_name='jack' connect by prior emp_id=lead_id;emp_id | lead_id | emp_name | salary | dept_no 
--------+---------+----------+--------+---------2 |       1 | jack     |  50500 | 0024 |       2 | scott    |  30000 | 0025 |       2 | tiger    |  25000 | 002
(3 rows)

5、查询jack和arise下的所有子节点

select * from employee start with emp_name in ('jack', 'arise') connect by prior emp_id=lead_id;emp_id | lead_id | emp_name | salary | dept_no 
--------+---------+----------+--------+---------2 |       1 | jack     |  50500 | 0024 |       2 | scott    |  30000 | 0025 |       2 | tiger    |  25000 | 0023 |       1 | arise    |  60000 | 0036 |       3 | wudde    |  23000 | 0037 |       3 | joker    |  21000 | 003
(6 rows)

6、查询jack的祖先节点

select * from employee start with emp_name='jack' connect by prior lead_id=emp_id;emp_id | lead_id | emp_name | salary  | dept_no 
--------+---------+----------+---------+---------2 |       1 | jack     |   50500 | 0021 |       0 | king     | 1000000 | 001
(2 rows)

7、查询一个节点的叔叔伯父节点

--查看emp_id为6的节点的叔叔伯父节点
with temp as (select  employee.*,prior emp_name,level lefrom employee start with lead_id = 0connect by lead_id=prior emp_id
)
select *
from temp t
left join temp tt on tt.emp_id=6 --此处需要限定
where t.le = (tt.le-1)and t.emp_id not in (tt.lead_id);emp_id | lead_id | emp_name | salary | dept_no | ?column? | le | emp_id | lead_id | emp_name | salary | dept_no | ?column? | le 
--------+---------+----------+--------+---------+----------+----+--------+---------+----------+--------+---------+----------+----2 |       1 | jack     |  50500 | 002     | king     |  2 |      6 |       3 | wudde    |  23000 | 003     | arise    |  3
(1 row)

8、查询族兄

--查看employee id是6的节点的族兄节点
with temp as (select employee.*,prior emp_name,level lefrom employee start with lead_id=0connect by lead_id= prior emp_id
)select t.*
from temp  t
left outer join temp tton tt.emp_id=6 --此处需要条件限制
where t.le=tt.le and t.emp_id<>6; --此处需要条件限制 emp_id | lead_id | emp_name | salary | dept_no | ?column? | le 
--------+---------+----------+--------+---------+----------+----4 |       2 | scott    |  30000 | 002     | jack     |  35 |       2 | tiger    |  25000 | 002     | jack     |  37 |       3 | joker    |  21000 | 003     | arise    |  3
(3 rows)

9、level伪列的使用,格式化层级

select lpad(' ',level*2,' ')||emp_name as name,emp_id,lead_id,salary,level
from employee
start with lead_id=0
connect by prior emp_id=lead_id; -- level数值越低级别越高name     | emp_id | lead_id | salary  | level 
-------------+--------+---------+---------+-------king      |      1 |       0 | 1000000 |     1jack    |      2 |       1 |   50500 |     2scott |      4 |       2 |   30000 |     3tiger |      5 |       2 |   25000 |     3arise   |      3 |       1 |   60000 |     2wudde |      6 |       3 |   23000 |     3joker |      7 |       3 |   21000 |     3
(7 rows)

10、connect_by_root 查找根节点

select connect_by_root emp_name,emp_name,lead_id,salary
from employee
start with lead_id=1
connect by prior emp_id = lead_id;connect_by_root | emp_name | lead_id | salary 
-----------------+----------+---------+--------jack            | jack     |       1 |  50500jack            | scott    |       2 |  30000jack            | tiger    |       2 |  25000arise           | arise    |       1 |  60000arise           | wudde    |       3 |  23000arise           | joker    |       3 |  21000
(6 rows)
-- 注意: connect_by_root关键字后面跟着字段,表示根节点对应记录的某一字段的值,-- 如 connect_by_root  emp_name表示根节点的员工名,connect_by_root salary表示根节点的工资

11、connect_by_isleaf 是否是叶子节点

select emp_id,emp_name,lead_id,salary,connect_by_isleaf
from employee
start with lead_id=0
connect by nocycle prior emp_id=lead_id;emp_id | emp_name | lead_id | salary  | connect_by_isleaf 
--------+----------+---------+---------+-------------------1 | king     |       0 | 1000000 |                 02 | jack     |       1 |   50500 |                 04 | scott    |       2 |   30000 |                 15 | tiger    |       2 |   25000 |                 13 | arise    |       1 |   60000 |                 06 | wudde    |       3 |   23000 |                 17 | joker    |       3 |   21000 |                 1
(7 rows)
-- 叶节点指的是没有子节点的节点,那些是既是父节点又是子节点的节点不属于叶节点

12、使用connect by rownum生成序列

ROWNUM是一个伪列,即先查到结果集之后再加上去的一个列,它的取值从1开始排依次递增。ROWNUM其实是oracle数据库从数据文件或缓冲区中读取数据的顺序。取得第一条记录则rownum值为1,第二条为2,依次类推。
connect by rownum是通过递归迭代第一行生成一个序列。格式如下:

select ***
from dual
connect by rownum<=n;

举例:

12.1 生成1-5之间的一个序列

select rownum 
from dual 
connect by rownum<=5;rownum 
--------12345
(5 rows)

12.2 生成10个60到100之间的随机整数

select rownum No,ROUND(DBMS_RANDOM.VALUE(60,100),0) Value
from dual
connect by rownum<=10;no | value 
----+-------1 |    772 |    643 |    674 |    865 |    826 |    777 |    948 |    899 |    6110 |    93
(10 rows)

12.3 生成连续的日期值

select rownum No,sysdate+rownum MyDate
from dual
connect by rownum<=10;no |       mydate        
----+---------------------1 | 2023-10-12 15:45:392 | 2023-10-13 15:45:393 | 2023-10-14 15:45:394 | 2023-10-15 15:45:395 | 2023-10-16 15:45:396 | 2023-10-17 15:45:397 | 2023-10-18 15:45:398 | 2023-10-19 15:45:399 | 2023-10-20 15:45:3910 | 2023-10-21 15:45:39
(10 rows)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/132810.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch 深度学习之加载数据集Dataset and DataLoader(七)

1. Revision: Manual data feed 全部Batch&#xff1a;计算速度&#xff0c;性能有问题 1 个 &#xff1a;跨越鞍点 mini-Batch:均衡速度与性能 2. Terminology: Epoch, Batch-Size, Iteration DataLoader: batch_size2, sheffleTrue 3. How to define your Dataset 两种处…

Verilog功能模块——同步FIFO

前言 FIFO功能模块分两篇文章&#xff0c;本篇为同步FIFO&#xff0c;另一篇为异步FIFO&#xff0c;传送门&#xff1a; Verilog功能模块——异步FIFO-CSDN博客 同步FIFO实现起来是异步FIFO的简化版&#xff0c;所以&#xff0c;本博文不再介绍FIFO实现原理&#xff0c;感兴趣…

Java面试题-0919

集合篇 Java面试题-集合篇HashMap底层实现原理概述javaSE进阶-哈希表 为了满足hashmap集合的不重复存储&#xff0c;为什么要重写hashcode和equals方法&#xff1f; 首先理解一下hashmap的插入元素的前提&#xff1a; hashmap会根据元素的hashcode取模进行比较&#xff0c;当…

【Java 进阶篇】创建 HTML 注册页面

在这篇博客中&#xff0c;我们将介绍如何创建一个简单的 HTML 注册页面。HTML&#xff08;Hypertext Markup Language&#xff09;是一种标记语言&#xff0c;用于构建网页的结构和内容。创建一个注册页面是网页开发的常见任务之一&#xff0c;它允许用户提供个人信息并注册成为…

Unity ToLua热更框架使用教程(1)

从本篇开始将为大家讲解ToLua在unity当中的使用教程。 Tolua的框架叫LuaFramework&#xff0c;首先附上下载链接&#xff1a; https://github.com/jarjin/LuaFramework_UGUI_V2 这个地址的是UGUI的。 下载完之后导入项目&#xff0c;首先&#xff0c;我们要先让这个项目跑起…

域渗透04-漏洞(CVE-2020-1472)

Netlogon协议&#xff1a; 想了解CVE-2020-1472&#xff0c;我们首先必须要了解Netlogon协议是什么&#xff1a; Netlogon 远程协议是 Windows 域控制器上可用的 RPC 接口。它用于与用户和计算机身份验证相关的各种任务&#xff0c;最常见的是方便用户使用 NTLM 协议登录到服务…

【数据结构】二叉树--链式结构的实现 (遍历)

目录 一 二叉树的遍历 1 构建一个二叉树 2 前序遍历 3 中序遍历 4 后续遍历 5 层序 6 二叉树销毁 二 应用(递归思想) 1 二叉树节点个数 2 叶子节点个数 3 第K层的节点个数 4 二叉树查找值为x的节点 5 判断是否是二叉树 一 二叉树的遍历 学习二叉树结构&#xff0…

【Ceph Block Device】块设备挂载使用

文章目录 前言创建pool创建user创建image列出image检索image信息调整image大小增加image大小减少image大小 删除image从pool中删除image从pool中“延迟删除”image从pool中移除“延迟删除的image” 恢复image恢复指定pool中延迟删除的image恢复并重命名image 映射块设备格式化i…

实现即时沟通与协作的全功能IM即时通讯系统

在当今竞争激烈的商业环境中&#xff0c;高效的沟通和协作成为企业取得成功的关键。在过去&#xff0c;电子邮件和电话等传统工具是企业之间进行沟通和协作的重要手段&#xff0c;然而&#xff0c;随着科技的发展和社交化的趋势&#xff0c;IM即时通讯系统正逐渐成为企业协作的…

JavaScript使用类-模态窗口

**上节课我们为这个项目获取了一些DOM元素&#xff0c;现在我们可以继续&#xff1b;**这个模态窗口有一个hidden类&#xff0c;这个类上文我们讲了&#xff0c;他的display为none&#xff1b;如果我们去除这个hidden的话&#xff0c;就可以让这个模态窗口展现出来。如下 cons…

分布式系统开发技术中的CAP定理原理

分布式系统开发技术中的CAP定理原理 在分布式系统开发中&#xff0c;CAP定理&#xff08;一致性、可用性和分区容忍性&#xff09;是指导我们设计、开发和维护系统的核心原理。该定理阐述了分布式系统中一致性、可用性和扩展性之间无法同时满足的矛盾关系&#xff0c;为我们提…

Django 静态自定义化配置

STATIC # APP本地静态资源目录&#xff08;就APP对应的&#xff09; STATIC_URL "/static/"# 远程静态文件URL&#xff08;少用&#xff09; REMOTE_STATIC_URL# 外部引用静态文件目录&#xff08;外层的&#xff09; STATICFILES_DIRS [os.path.join(BASE_DIR, &…