Oracle递归查询层级及路径

一、建表及插入数据

ocation_id location_name parent_location_id
1 广东省 NULL
2 广州市 1
3 深圳市 1
4 天河区 2
5 番禺区 2
6 南山区 3
7 宝安区 3

建表sql:

sql 复制代码
CREATE TABLE locations (
    location_id NUMBER PRIMARY KEY,
    location_name VARCHAR2(100),
    parent_location_id NUMBER
);
INSERT INTO locations (location_id, location_name, parent_location_id)
VALUES (1, '广东省', NULL);

INSERT INTO locations (location_id, location_name, parent_location_id)
VALUES (2, '广州市', 1);

INSERT INTO locations (location_id, location_name, parent_location_id)
VALUES (3, '深圳市', 1);

INSERT INTO locations (location_id, location_name, parent_location_id)
VALUES (4, '天河区', 2);

INSERT INTO locations (location_id, location_name, parent_location_id)
VALUES (5, '番禺区', 2);

INSERT INTO locations (location_id, location_name, parent_location_id)
VALUES (6, '南山区', 3);

INSERT INTO locations (location_id, location_name, parent_location_id)
VALUES (7, '宝安区', 3);

二、展现出省市县之间的层级结构

sql:

sql 复制代码
SELECT location_id, location_name, LEVEL
FROM locations
CONNECT BY PRIOR location_id = parent_location_id
START WITH parent_location_id IS NULL;

结果:

location_id location_name LEVEL
1 广东省 1
2 广州市 2
4 天河区 3
5 番禺区 3
3 深圳市 2
6 南山区 3
7 宝安区 3

三、每个区域在层级结构中的完整路径

sql:

sql 复制代码
SELECT location_id, 
       location_name, 
       LEVEL, 
       SYS_CONNECT_BY_PATH(location_name,'/') AS path
FROM locations
CONNECT BY PRIOR location_id = parent_location_id
START WITH parent_location_id IS NULL;

结果:

location_id location_name LEVEL path
1 广东省 1 广东省
2 广州市 2 广东省/广州市
4 天河区 3 广东省/广州市/天河区
5 番禺区 3 广东省/广州市/番禺区
3 深圳市 2 广东省/深圳市
6 南山区 3 广东省/深圳市/南山区
7 宝安区 3 广东省/深圳市/宝安区
相关推荐
IvorySQL9 分钟前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·19 分钟前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德22 分钟前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫1 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i1 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.1 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn1 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露2 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
冰暮流星2 小时前
sql语言之分组语句group by
java·数据库·sql
符哥20082 小时前
Ubuntu 常用指令集大全(附实操实例)
数据库·ubuntu·postgresql