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 核心口诀
- 根节点 LEVEL=1
- 向下递归:
PRIOR 子ID = 父ID - 向上递归:
PRIOR 父ID = 子ID - 生成序列 / 日期:
CONNECT BY LEVEL <= N - 过滤层级:
WHERE LEVEL = x或LEVEL <= x