oracle connect by详解

news2024/12/27 12:12:14

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 | 002
      4 |       2 | scott    |  30000 | 002
      5 |       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 | 002
      4 |       2 | scott    |  30000 | 002
      5 |       2 | tiger    |  25000 | 002
      3 |       1 | arise    |  60000 | 003
      6 |       3 | wudde    |  23000 | 003
      7 |       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 | 002
      1 |       0 | king     | 1000000 | 001
(2 rows)

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

--查看emp_id为6的节点的叔叔伯父节点
with temp as (
    select  employee.*,
            prior emp_name,
            level le
    from employee 
    start with lead_id = 0
    connect 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 le
   from employee 
   start with lead_id=0
   connect by lead_id= prior emp_id
)

select t.*
from temp  t
left outer join temp tt
 on 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     |  3
      5 |       2 | tiger    |  25000 | 002     | jack     |  3
      7 |       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 |     1
     jack    |      2 |       1 |   50500 |     2
       scott |      4 |       2 |   30000 |     3
       tiger |      5 |       2 |   25000 |     3
     arise   |      3 |       1 |   60000 |     2
       wudde |      6 |       3 |   23000 |     3
       joker |      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 |  50500
 jack            | scott    |       2 |  30000
 jack            | tiger    |       2 |  25000
 arise           | arise    |       1 |  60000
 arise           | wudde    |       3 |  23000
 arise           | 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 |                 0
      2 | jack     |       1 |   50500 |                 0
      4 | scott    |       2 |   30000 |                 1
      5 | tiger    |       2 |   25000 |                 1
      3 | arise    |       1 |   60000 |                 0
      6 | wudde    |       3 |   23000 |                 1
      7 | 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 
--------
      1
      2
      3
      4
      5
(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 |    77
  2 |    64
  3 |    67
  4 |    86
  5 |    82
  6 |    77
  7 |    94
  8 |    89
  9 |    61
 10 |    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:39
  2 | 2023-10-13 15:45:39
  3 | 2023-10-14 15:45:39
  4 | 2023-10-15 15:45:39
  5 | 2023-10-16 15:45:39
  6 | 2023-10-17 15:45:39
  7 | 2023-10-18 15:45:39
  8 | 2023-10-19 15:45:39
  9 | 2023-10-20 15:45:39
 10 | 2023-10-21 15:45:39
(10 rows)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

geecg-uniapp 路由修改 页面创建 (2)

首先打开 首页面 &#xff08;1&#xff09;我们以home的常用服务 为例 我们修改 usList 数据 &#xff08;2&#xff09;查找对应路径 work.js 我们修改荒石对应的路径 现在跳转 helloword &#xff08;3&#xff09;修改跳转路径 &#xff08;4&#xff09;创建页面 …

Python —— 接口测试之使用requests发起请求实战

1、认识requests模块 1、requests介绍 requests是一个第三方库&#xff0c;因此首先需要安装这个库&#xff0c;安装三步走&#xff1a; 安装&#xff1a;pip install requests在文件中引用这个模块&#xff1a;import requests使用这个库发起一个请求&#xff08;get请求、…

C++——容器适配器

1. 什么是适配器&#xff1f; 容器适配器是C标准库中的一种数据结构&#xff0c;它可以将不同类型的容器&#xff08;如vector、list、deque等&#xff09;转换为另一种类型的容器。容器适配器提供了一种简单的方式来重新组织和访问数据&#xff0c;同时隐藏了底层容器的实现细…

C++ 多维数组

C 支持多维数组。多维数组声明的一般形式如下&#xff1a; type name[size1][size2]...[sizeN];例如&#xff0c;下面的声明创建了一个三维 5 . 10 . 4 整型数组&#xff1a; int threedim[5][10][4];二维数组 多维数组最简单的形式是二维数组。一个二维数组&#xff0c;在本…

vue启用打印机打印-二维码条形码打印

起因 资产、设备管理必备的二维码条形码打印 原理 所需插件 vue-print-nb 本文版本1.7.5 构建所需要打印的内容&#xff0c;利用vue-print-nb进行打印。二维码条形码打印的本质就是图片打印 代码 html部分 <div ref"printDom"id"printDom">//…

Linux内存管理 | 二、虚拟地址空间布局

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强企业&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …

SNAP计算哨兵2号的LAI/FVC/FAPAR

SNAP计算LAI 简介 SNAP的计算LAI方法是基于PROSAIL模型&#xff0c;集成的模块&#xff0c;很方便。 首先要下载SNAP软件&#xff0c;下载步骤见博文 打开数据 找到影像的.xml文件 拖入左边的空白框中&#xff0c;发现所有波段会显示如下。这些数据都是已经经过处理完成之后…

Vue之VueX知识探索(一起了解关于VueX的新世界)

目录 前言 一、VueX简介 1. 什么是VueX 2. VueX的作用及重要性 3. VueX的应用场景 二、VueX的使用准备工作 1. 下载安装VueX 2. vuex获取值以及改变值 2.1 创建所需示例 2.2 将创建好的.vue文件页面显示 2.3 创建VueX的相关文件 2.4 配置VueX四个js文件 2.5 加载到vue示…

网络架构介绍

1 网络 7 层架构 7 层模型主要包括&#xff1a; 1. 物理层&#xff1a;主要定义物理设备标准&#xff0c;如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流&#xff08;就是由 1、0 转化为电流强弱来进行传输,到达目的地后在转化为1、0…

简述电子设计中的EMC、EMI、ESD

简述电子设计中的EMC、EMI、ESD ESD EMI EMC ESD、EMI、EMC 设计是电子工程师在设计中遇到最常见的难题&#xff0c;电磁兼容性&#xff08;EMC&#xff09;是指设备或系统在其电磁环境中符合要求运行并不对其环境中的任何设备产生无法忍受的电磁干扰的能力。 因此&#xff0…

【2023年11月第四版教材】第24章《法律法规与标准规范》(合集篇)

第24章《法律法规与标准规范》(合集篇&#xff09; 1 民法典&#xff08;合同编&#xff09;2 招标投标法2.1 关于时间的总结2.2 内容 3 政府采购法4 专利法5 著作权法6 商标法7 网络安全法8 数据安全法 1 民法典&#xff08;合同编&#xff09; 1、要约是希望和他人订立合同的…

LLM - 旋转位置编码 RoPE 代码详解

目录 一.引言 二.RoPE 理论 1.RoPE 矩阵形式 2.RoPE 图例形式 3.RoPE 实践分析 三.RoPE 代码分析 1.源码获取 2.源码分析 3.rotary_emb 3.1 __init__ 3.2 forward 4.apply_rotary_pos_emb 4.1 rotate_half 4.2 apply_rotary_pos_emb 四.RoPE 代码实现 1.Q/K/V …

苹果ios开发者ipa文件包内测人数签名真机数量满了应该怎么做?

苹果ios开发者ipa文件包内测人数签名真机数量满了应该怎么做&#xff1f; 有人总是问我开发者的设备满了怎么做才可以让设备增加&#xff1f;或者我要怎么做才能让员工的设备都可以安装&#xff0c;那么首先我们要做到的就是要知道我们的开发者都是拥有多少内测设备&#xff1f…

放大器的输入、输出电压范围的理解

问题电路 由于运放SGM8295不是轨到轨的电路&#xff0c;导致U29.1输出电压只有当输入到一定门限的时候才会有输出。 上图表示输入电压工作范围为如上&#xff0c;在此以外的不能正常工作。 一篇很好的运放的输入/输出文章介绍 https://zhuanlan.zhihu.com/p/351740051?utm_id0…

【Java学习之道】异常的处理方式

引言 今天我们将聚焦于异常处理&#xff0c;这是每一个Java程序员都应该掌握的核心技能之一。通过学习这些内容&#xff0c;你将能够更好地应对程序中的意外情况&#xff0c;提高程序的健壮性和可靠性。 一、异常的处理方式 在Java中&#xff0c;异常处理主要通过使用try-ca…

后厂村路灯在线签名网站,在线签名工具,IPA在线签名

IPA在线签名工具网站&#xff0c;在线实现IPA包签名 案例网站&#xff1a;在线签名 - 后厂村路灯https://sign.vx365.vip/ 用户可以自定义签名网站样式。 用户可以独立部署到自己服务器&#xff0c;使用自己的域名。 用户可以使用自己服务器&#xff0c;加快签名速度&#xf…

YB4618 具有充电前端过电压和过温保护功能,低压差充电前端 OVP 保护开关IC

YB4618 低压差充电前端 OVP 保护开关 概述: YB4618 具有充电前端过电压和过温保护功能。支持 3V 到 40V 的宽输入电压工作范围。过压保护阈值可以外部设置或采用内部默认设置。超快的过压保护响应速度能够确保后级电路的安全。集成了超低导通阻抗的 nFET 开关&#xff0c;确…

Explain执行计划字段解释说明---type字段说明(02)

type显示访问类型详解 &#xff08;1&#xff09;system 表只有一行记录&#xff08;等于系统表&#xff09;&#xff0c;这是const类型的特列&#xff0c;平时不会出现&#xff0c;这个也可以忽略不计。 &#xff08;2&#xff09;const 表示通过索引一次就找到了,const用…

提升战斗力!吃鸡行家分享顶级游戏干货,助你轻松拿下绝地求生

作为吃鸡行家&#xff0c;我们都知道&#xff0c;在绝地求生中提高战斗力至关重要。今天我来分享一些独特的干货&#xff0c;帮助你成为顶级的吃鸡玩家&#xff0c;并分享一些方便吃鸡作图、装备皮肤库存展示和查询的技巧。 首先&#xff0c;让我们来谈谈绝地求生作图工具推荐。…

【Java学习之道】异常的概念与分类

引言 异常处理是Java编程中重要的一部分&#xff0c;它可以让我们更好地处理程序中可能出现的错误和异常情况。同时&#xff0c;Java也提供了强大的输入/输出流功能&#xff0c;让我们可以轻松地读取和写入数据。这一章&#xff0c;我们就来探讨这两个话题&#xff0c;让你的J…