Oracle递归/树状查询

article/2025/7/22 19:31:37

目录

1.递归与LEVEL简介 

2.往子项找

3.往父项找

4.练习题 

练习1:找出BLAKE的直系下属有哪些? 

练习2

5.递归的其他应用——生成连续的数字或日期


1.递归与LEVEL简介 

递归:从顶层到下一层级,一层一层递归去找。

递归里面有一个很重要的关键字,LEVEL——伪列(关键字),代表树形结构中的层级编号。

递归查询应用场景:组织架构图、文件路径分析、菜单导航树、账单父子关联、社交网络关系链等。 

递归查询语法:

SELECT level,a.* 
FROM 表名 a
--WHERE 条件1
START WITH  条件2 --设置起点,用来限制第一层的数据,或者叫根节点数据
CONNECT BY PRIOR 条件3 --用来指明在查找数据时以怎样的一种关系去查找

prior:--英文释义:在前的,优先的

表示上一层级的标识符。经常用来对下一层级的数据进行限制,但是不可以接伪列。

PRIOR放在子节点方向时,表示从上往下遍历,即从根节点向叶节点方向遍历。

sys_connect_by_path(字段,拼接符) :将递归过程中的列进行拼接。  

2.往子项找

PRIOR 侧的字段是 EMPNO,就是往下属寻找

示例:找KING这个员工的所有下属

select level, EMP.*           -- 5
from EMP                      -- 1
where ENAME!='KING'           -- 4
START WITH ENAME = 'KING'     -- 2
connect by prior EMPNO = MGR  -- 3  设置起点,用来限制第一层的数据,或者叫根节点数据
order by LEVEL;               -- 6

 

3.往父项找

示例:查找7876员工的所有领导

select LEVEL, EMP.*
from EMP
where LEVEL != 1
start with EMPNO = 7876
connect by prior MGR = EMPNO;

 

4.练习题 

练习1:找出BLAKE的直系下属有哪些? 

select LEVEL, sys_connect_by_path(ENAME, '-') subordinate
from EMP
where LEVEL = 2
start with ENAME = 'BLAKE'
connect by prior EMPNO = MGR;

 

练习2

CREATE TABLE SC_DISTRICT
(ID         NUMBER(10)                  NOT NULL,PARENT_ID  NUMBER(10),NAME       VARCHAR2(255 BYTE)          NOT NULL
);INSERT INTO SC_DISTRICT VALUES(1,NULL,'四川省');INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(2,1,'巴中市');
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(3,1,'达州市'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(4,2,'巴州区');
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(5,2,'通江县');
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(6,2,'平昌县');INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(7,3,'通川区');
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(8,3,'宣汉县');INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(9,8,'塔河乡');
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(10,8,'三河乡');
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(11,8,'胡家镇');
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(12,8,'南坝镇');INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(13,6,'大寨乡');
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(14,6,'响滩镇');
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(15,6,'龙岗镇');
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(16,6,'白衣镇');COMMIT;SELECT * FROM SC_DISTRICT;

1. 找出 巴中市(可以把巴中市 也一起 查询出来,也可以不查询巴中市本身那条数据) 的所有下属区域 

select LEVEL, s.*
from SC_DISTRICT s
-- where level >= 2
start with NAME = '巴中市'
connect by prior ID = PARENT_ID;

2. 找出 宣汉县 的所有上级(父级)区域

select LEVEL, s.*
from SC_DISTRICT s
where LEVEL != 1
start with NAME = '宣汉县'
connect by prior PARENT_ID = ID;

5.递归的其他应用——生成连续的数字或日期

面试题:写sql输出1~100

select LEVEL
from DUAL
connect by LEVEL <= 100;

示例 :输出最近10天的日期

select trunc(sysdate) - LEVEL + 1 recent
from DUAL
connect by LEVEL <= 10
order by recent;

 

练习1:输出20~30

-- 方法一
select LEVEL
from DUAL
where LEVEL >= 20
connect by LEVEL <= 30;-- 方法二
select LEVEL + 19
from DUAL
connect by LEVEL <= 11;

练习2: 输出从2025-01-01到当前的所有日期

select to_date('2025-01-01', 'YYYY-MM-DD') + LEVEL - 1 now-- -1是为了显示起始日期
from DUAL
connect by LEVEL <= trunc(sysdate) - to_date('2025-01-01', 'YYYY-MM-DD') + 1;
-- 直接相减得到的是间隔天数,总天数 = 间隔天数 + 1-- 方法二:不使用递归,使用ROWNUM
SELECT TO_DATE('2025-01-01', 'YYYY-MM-DD') + ROWNUM - 1 AS date_value
FROM ALL_OBJECTS
WHERE ROWNUM <= TRUNC(SYSDATE) - TO_DATE('2025-01-01', 'YYYY-MM-DD') + 1
ORDER BY date_value;

CREATE TABLE TABLE_DATE (OP_DAY DATE);
INSERT INTO TABLE_DATE VALUES ( TO_DATE('20211201','YYYYMMDD'));
INSERT INTO TABLE_DATE VALUES ( TO_DATE('20211202','YYYYMMDD'));
INSERT INTO TABLE_DATE VALUES ( TO_DATE('20211203','YYYYMMDD'));
INSERT INTO TABLE_DATE VALUES ( TO_DATE('20211204','YYYYMMDD'));
INSERT INTO TABLE_DATE VALUES ( TO_DATE('20211205','YYYYMMDD'));
INSERT INTO TABLE_DATE VALUES ( TO_DATE('20211208','YYYYMMDD'));
INSERT INTO TABLE_DATE VALUES ( TO_DATE('20211209','YYYYMMDD'));
INSERT INTO TABLE_DATE VALUES ( TO_DATE('20211210','YYYYMMDD'));
INSERT INTO TABLE_DATE VALUES ( TO_DATE('20211213','YYYYMMDD'));
INSERT INTO TABLE_DATE VALUES ( TO_DATE('20211214','YYYYMMDD'));
INSERT INTO TABLE_DATE VALUES ( TO_DATE('20211215','YYYYMMDD'));
COMMIT;SELECT * FROM TABLE_DATE;

某图书馆 20211201 到 20211215 开放时间如下

开放日期:

20211201

20211202

20211203

20211204

20211205

20211208

20211209

20211210

20211213

20211214

20211215

问题:根据上表,计算出 20211201 到 20211215  期间没有开放的有哪些日期

select to_date('20211201', 'YYYYMMDD') + LEVEL - 1 day
from DUAL
connect by LEVEL <= to_date('20211215', 'YYYYMMDD') - to_date('20211201', 'YYYYMMDD') + 1
minus
select OP_DAY
from TABLE_DATE;-- 方法二:临时表
with t1 as (select TO_DATE('20211201', 'YYYYMMDD') + LEVEL - 1 dayfrom DUALconnect by LEVEL <= TO_DATE('20211215', 'YYYYMMDD') - TO_DATE('20211201', 'YYYYMMDD') + 1)
select day
from t1
where not exists(select OP_DAYfrom TABLE_DATEwhere OP_DAY = day);


http://www.hkcw.cn/article/myRGKOEHmG.shtml

相关文章

美国发生针对性恐怖袭击 亲以色列团体遇袭

美国媒体6月1日报道,科罗拉多州博尔德市当天发生一起针对亲以色列团体活动的袭击事件,造成至少5人受伤。当地警方已经封锁事发街区并疏散数个邻近街区,一名男子被逮捕。美国联邦调查局将这一事件定性为“有针对性的恐怖袭击”。责任编辑:zhangxiaohua

巴媒称以军炸毁加沙中部清真寺 以色列暂无回应

据巴勒斯坦《圣城报》报道,当地时间6月2日凌晨,以色列军方飞机炸毁了加沙地带中部代尔拜拉赫的一座清真寺。目前,以色列方面尚未对此事作出回应。责任编辑:zhangxiaohua

InfluxDB 高级分析实战:预测、技术指标与异常检测全指南

InfluxDB 不仅是强大的时序数据存储引擎&#xff0c;更是企业构建智能分析系统的核心平台。本文全面解析如何利用 InfluxDB 内置函数与 Python 生态实现&#xff1a; ✅ ​​预测分析​​&#xff1a;从简单季节性预测&#xff08;HOLT_WINTERS&#xff09;到复杂模型集成&…

图解AI三大核心技术:RAG、大模型、智能体【推荐文章】

大模型中的Transformer与混合专家&#xff08;MoE&#xff09; 5种大模型微调技术 传统RAG与Agentic RAG对比 5种经典的智能体设计模式 5大文本分块策略 智能体系统的5个等级 传统RAG vs HyDE RAG vs Graph RAG KV caching 转载的原文链接&#xff1a;图解AI三大核心技术&#…

命令行部署金仓读写分离集群

有大佬会问&#xff0c;图形化方式部署多流畅&#xff0c;干嘛自虐非要倒腾命令行方式&#xff0c;那是因为我们的环境要通过VPN再到堡垒机最后才能xshell登录&#xff0c;而且VPN、堡垒机不定时频繁超时断开。 KingbaseES读写分离集群简介 在多数据库实例的热备模式下&#…

南部战区海军多艘舰艇实战化演练 提升协同作战能力

南部战区海军某训练中心联合某驱逐舰支队组织渭南舰、玉林舰等多艘舰艇,在多个海域展开多个课目训练,旨在检验编队协同作战能力和指挥员决策水平。在编队航行途中,突然接到上级通报,当前活动海区有敌方无人艇活动。各舰立即进入战斗状态。渭南舰雷达战位敏锐发现不明海上目…

乌对俄发动大规模特种作战 美方回应 未提前获知袭击计划

当地时间6月1日,美国政府官员表示,特朗普政府并未提前得知乌克兰将在周末对俄罗斯发起的大规模袭击行动。同一天,乌克兰国家安全局在社交媒体上宣布,对俄罗斯实施了特种作战行动,袭击了俄军的战略轰炸机。乌克兰总统泽连斯基当晚发表视频讲话称,乌国家安全局为此行动筹备…

VisionPro项目记录2 —— 不规则胶路检测

简介 本文介绍了一种基于Cognex视觉工具的胶路检测方法&#xff0c;分为直线和弧形两部分检测。 直线部分采用卡尺工具检测胶路宽度&#xff0c;通过动态调整仿射矩形区域进行多位置测量&#xff1b;弧形部分使用blob工具沿圆周设置检测区域。 两种方法均通过脚本实现工具映…

STM32F407寄存器操作(多通道单ADC+DMA)

1.前言 又是半年没更新了&#xff0c;趁着端午放假有点时间&#xff0c;并且最近项目要用这块知识&#xff0c;我就顺带研究一下ADC吧。 一般来说ADC主要用法包含了1.单通道软件触发&#xff08;这是最简单和最常用的用法&#xff09;2.单通道多次采集&#xff08;需要快速采…

RuoYi前后端分离框架实现前后端数据传输加密(二)之前端篇

一、背景 本文是RuoYi前后端分离框架实现前后端数据传输加密(一)之后端篇文章配套的,主要介绍前端对自定义字段传输加密的实现,两篇文章结合可以完整的完成RuoYi前后端分离框架对API通信过程中实现自定义字段加密传输。前端的加解密实现,不涉及到界面的修改,仅仅是方法的…

马斯克称不想为美政府所做一切担责 “政府效率部”成替罪羊

美国企业家埃隆马斯克在接受哥伦比亚广播公司采访时表达了对政府的看法。他表示自己并不想公开反对美国政府,但也不愿意为政府所做的一切承担责任。马斯克提到,他领导的“政府效率部”成了所有问题的替罪羊,所有的裁员无论真假都被归咎于这个部门。马斯克还表示,他对国会共…

苏超第三轮全部战罢 南通队强势领跑

6月1日晚9时28分,江苏省城市足球联赛第三轮结束。本轮赛事分为两个比赛日进行。5月31日,镇江队0∶2不敌宿迁队,常州队0∶1负于扬州队,徐州队2∶1战胜连云港队。6月1日,盐城队1∶0击败淮安队,泰州队0∶4输给南通队,南京队与无锡队的比赛以1∶0结束。本轮联赛中,南通队和…

节后粽子有买三送一还有6折出售 促销力度大吸引顾客

作为传统节令食品,粽子在今年端午节期间再次成为餐桌主角。与往年不同的是,除了经典的“咸甜之争”外,“低卡”、“低脂”等健康概念成为今年粽子市场的新亮点。据《2025中国粽子行业白皮书》,从规模上来看,2025年中国粽子行业市场规模将达到110亿元,增长率在7%左右,产量…

泽连斯基再提乌俄领导人会晤 需达成具体协议

据法新社报道,俄罗斯总统新闻秘书佩斯科夫周三对乌克兰总统泽连斯基呼吁举行美俄乌三国领导人会谈一事作出回应。佩斯科夫表示,只有在俄乌双方达成具体协议后,才有可能举行此类会谈。他强调,这样的会谈应是乌克兰和俄罗斯代表团之间达成具体协议的结果。此前,乌克兰总统泽…

3、禁止树莓派屏幕休眠,设置树莓派屏幕常亮

树莓派是微型电脑&#xff0c;系统自带休眠保护功能&#xff0c;但是有人可能会处理一些事务&#xff0c;想树莓派屏幕常亮&#xff0c;保证树莓派一直都处于活动状态&#xff0c;今天分享如何让树莓派屏幕常亮&#xff0c;禁止休眠的解决方案。 1、 系统&#xff1a;raspbia…

巴黎欧冠夺冠狂欢夜559人被捕 暴力事件引发谴责

法甲球队巴黎圣日耳曼在5月31日晚赢得欧冠联赛冠军奖杯,法国多地的球迷彻夜庆祝。然而,据法国内政部消息,在狂欢夜有559人因滋事被捕,并发生了两起命案。6月1日,法国总统马克龙在爱丽舍宫接见巴黎圣日耳曼球队时,严厉谴责了庆祝活动中发生的暴力事件,称这些行为“不可接…

英国耗资百亿英镑新建核潜艇 备战状态升级

英国首相斯塔默表示,他将“恢复英国的战备状态”,并将提高英国的武器生产能力。6月2日,英国政府发布了《战略国防评估》,这份报告评估了英国面临的威胁,包括俄乌冲突及美国总统特朗普向北约盟国施压,要求提高国防开支及加强防御等情况。该报告呼吁英国武装部队进入“备战…

飞牛fnNAS装机之迷你小主机的利旧

前几天找Console线的时候,翻出一台迷你小主机,想起来以前是做“软路由”用的,现在用不上了。本想放回箱子,但突然想起最近正在做飞牛NAS的专题,不如将其改造成NAS得了。 这个东东有HDMI、VGA接口,2个USB(其中一个支持3.0),还有4个网口。 打开机盖,看看内部情况。发现…

2025年渗透测试面试题总结-奇安信[校招]奇安信观星实验室(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 奇安信[校招]奇安信观星实验室 1. 跟过的大型应用软件CVE漏洞 2. 容器虚拟化漏洞研究 3. 系统审计案例与漏…

郑钦文法网对阵萨巴伦卡 山海皆可平

6月1日,在法国网球公开赛女单第四轮比赛中,中国选手郑钦文以2比1战胜俄罗斯选手萨姆索诺娃,首次闯入法网女单8强。赛后,郑钦文发文:“人都应该有梦,有梦就别怕痛,是一颗宝石就该闪烁”,并鼓励大家勇敢追梦。在另一场1/8决赛中,头号种子萨巴伦卡把握住第八个赛点,以7-…