ORACLE LEVEL函数练习

Oracle LEVEL 专项练习(必练 10 题)

LEVEL 是 Oracle 树形查询专属伪列 ,表示当前递归层级,根节点 = 1,每递归一层 + 1。

先建测试表(所有练习通用)

sql

复制代码
CREATE TABLE emp (
    emp_id NUMBER PRIMARY KEY,
    name VARCHAR2(20),
    mgr_id NUMBER
);

INSERT INTO emp VALUES(1, '董事长', NULL);
INSERT INTO emp VALUES(2, '总经理', 1);
INSERT INTO emp VALUES(3, '销售总监', 2);
INSERT INTO emp VALUES(4, '华北经理', 3);
INSERT INTO emp VALUES(5, '华南经理', 3);
INSERT INTO emp VALUES(6, '北京销售', 4);
INSERT INTO emp VALUES(7, '深圳销售', 5);

COMMIT;

练习 1:最基础 ------ 显示每个人的层级

sql

复制代码
SELECT
    emp_id,
    name,
    mgr_id,
    LEVEL 层级
FROM emp
START WITH mgr_id IS NULL
CONNECT BY PRIOR emp_id = mgr_id;

目标:理解 LEVEL 从 1 开始递增。


练习 2:只查第 2 层(总经理)

sql

复制代码
SELECT *
FROM (
    SELECT name, LEVEL 层级
    FROM emp
    START WITH mgr_id IS NULL
    CONNECT BY PRIOR emp_id = mgr_id
)
WHERE 层级 = 2;

练习 3:只查叶子节点(最底层员工)

sql

复制代码
SELECT name, LEVEL 层级
FROM emp
WHERE CONNECT_BY_ISLEAF = 1  -- 1=叶子节点
START WITH mgr_id IS NULL
CONNECT BY PRIOR emp_id = mgr_id;

练习 4:只查3 级及以下

sql

复制代码
SELECT name, LEVEL 层级
FROM emp
WHERE LEVEL <= 3
START WITH mgr_id IS NULL
CONNECT BY PRIOR emp_id = mgr_id;

练习 5:按层级缩进显示(树形排版)

sql

复制代码
SELECT
    LPAD(' ', 2*(LEVEL-1)) || name AS 树形结构,
    LEVEL 层级
FROM emp
START WITH mgr_id IS NULL
CONNECT BY PRIOR emp_id = mgr_id;

练习 6:向上递归查上级,LEVEL 反向计数

sql

复制代码
-- 查"北京销售"所有上级,LEVEL 从自己开始=1
SELECT name, LEVEL
FROM emp
START WITH name = '北京销售'
CONNECT BY PRIOR mgr_id = emp_id;

练习 7:用 LEVEL 生成连续数字(面试高频)

不用表,直接生成 1~10:

sql

复制代码
SELECT LEVEL AS num
FROM dual
CONNECT BY LEVEL <= 10;

生成 5~15:

sql

复制代码
SELECT LEVEL+4 AS num
FROM dual
CONNECT BY LEVEL <= 11;

练习 8:生成连续日期(LEVEL 超级常用)

生成未来 7 天:

sql

复制代码
SELECT
    SYSDATE + LEVEL - 1 AS dt,
    LEVEL
FROM dual
CONNECT BY LEVEL <= 7;

练习 9:生成多行重复数据(测试数据专用)

sql

复制代码
SELECT '测试数据' || LEVEL AS txt, LEVEL
FROM dual
CONNECT BY LEVEL <= 5;

练习 10:限定递归深度(最多递归 2 层)

sql

复制代码
SELECT name, LEVEL
FROM emp
START WITH mgr_id IS NULL
CONNECT BY PRIOR emp_id = mgr_id
       AND LEVEL <= 2; -- 只到总经理

LEVEL 核心口诀

  1. 根节点 LEVEL=1
  2. 向下递归:PRIOR 子ID = 父ID
  3. 向上递归:PRIOR 父ID = 子ID
  4. 生成序列 / 日期:CONNECT BY LEVEL <= N
  5. 过滤层级:WHERE LEVEL = xLEVEL <= x
相关推荐
倔强的石头_14 分钟前
SQL 语法全兼容,但结果就是不一样——国产化迁移里最难缠的九类隐患
数据库
kobe_OKOK_1 小时前
django外键字段会自动在数据库字段后面加上_id
数据库·django·sqlite
<小智>9 小时前
及时做APP开发实战(十二)-LazyForEach懒加载优化实践
数据库·鸿蒙
龙仔7259 小时前
人大金仓KingbaseES V8 手动单库备份&恢复操作笔记
数据库·笔记·oracle·人大金仓
夏贰四12 小时前
数据库迁移怎样降低人力投入?数据库迁移怎么实现全量增量同步?
数据库·数据库迁移
汇智信科12 小时前
图谱、向量、关键词、SQL多路一体,FastKG垂域召回率100%拉满
网络·数据库·ai编程·汇智信科·hsim·fastclaw·汇智龙虾
笨蛋不要掉眼泪14 小时前
MySQL架构揭秘:慢查询日志详解
数据库·mysql·架构
pulinzt14 小时前
Tableau的基础使用
数据库·numpy
糖果店的幽灵15 小时前
【langgraph 从入门到精通graphApi 篇】LangGraphAPI 方式调用 - 初识与核心概念
数据库·人工智能·langgraph
TlSfoward15 小时前
TLSFOWARD TLS指纹
开发语言·数据库·爬虫·搜索引擎·https·php