+-----------+
| city |
|-----------|
|id | <---+
|name | |
|description| 1:n
|status | |
|parent_id | o---+
+-----------+
例 4.2. 递归查询实例 city 表
定义结构
CREATE TABLE city
(
id serial NOT NULL,
name character varying,
parent_id integer,
status boolean,
CONSTRAINT city_pkey PRIMARY KEY (id),
CONSTRAINT city_parent_id_fkey FOREIGN KEY (parent_id)
REFERENCES city (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE city
OWNER TO sys;
插入数据
INSERT INTO city (id, name, parent_id, status) VALUES (1, '广东', NULL, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (2, '湖南', NULL, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (3, '深圳', 1, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (4, '东莞', 1, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (5, '福田', 3, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (6, '南山', 3, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (7, '宝安', 3, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (8, '西乡', 7, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (9, '福永', 7, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (10, '龙华', 7, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (11, '长沙', 2, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (12, '湘潭', 2, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (13, '常德', 2, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (14, '桃源', 13, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (15, '汉寿', 13, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (16, '黑龙江', NULL, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (17, '伊春', 16, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (18, '哈尔滨', 16, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (19, '齐齐哈尔', 16, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (20, '牡丹江', 16, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (21, '佳木斯', 16, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (22, '民治', 10, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (23, '上塘', 10, NULL);
查询
WITH RECURSIVE path(id, name, path, idpath, parent_id, status) AS (
SELECT id, name, '/' || name , '/' || id , parent_id, status FROM city WHERE parent_id is null
UNION
SELECT
city.id,
city.name,
parentpath.path ||
CASE parentpath.path
WHEN '/' THEN ''
ELSE '/'
END || city.name,
parentpath.idpath ||
CASE parentpath.idpath
WHEN '/' THEN ''
ELSE '/'
END || city.id,
city.parent_id, city.status
FROM city, path as parentpath
WHERE city.parent_id = parentpath.id
)
SELECT * FROM path;
结果输出
id | name | path | idpath | parent_id | status
----+----------+---------------------------+--------------+-----------+--------
1 | 广东 | /广东 | /1 | |
2 | 湖南 | /湖南 | /2 | |
16 | 黑龙江 | /黑龙江 | /16 | |
3 | 深圳 | /广东/深圳 | /1/3 | 1 |
4 | 东莞 | /广东/东莞 | /1/4 | 1 |
11 | 长沙 | /湖南/长沙 | /2/11 | 2 |
12 | 湘潭 | /湖南/湘潭 | /2/12 | 2 |
13 | 常德 | /湖南/常德 | /2/13 | 2 |
17 | 伊春 | /黑龙江/伊春 | /16/17 | 16 |
18 | 哈尔滨 | /黑龙江/哈尔滨 | /16/18 | 16 |
19 | 齐齐哈尔 | /黑龙江/齐齐哈尔 | /16/19 | 16 |
20 | 牡丹江 | /黑龙江/牡丹江 | /16/20 | 16 |
21 | 佳木斯 | /黑龙江/佳木斯 | /16/21 | 16 |
5 | 福田 | /广东/深圳/福田 | /1/3/5 | 3 |
6 | 南山 | /广东/深圳/南山 | /1/3/6 | 3 |
7 | 宝安 | /广东/深圳/宝安 | /1/3/7 | 3 |
14 | 桃源 | /湖南/常德/桃源 | /2/13/14 | 13 |
15 | 汉寿 | /湖南/常德/汉寿 | /2/13/15 | 13 |
8 | 西乡 | /广东/深圳/宝安/西乡 | /1/3/7/8 | 7 |
9 | 福永 | /广东/深圳/宝安/福永 | /1/3/7/9 | 7 |
10 | 龙华 | /广东/深圳/宝安/龙华 | /1/3/7/10 | 7 |
22 | 民治 | /广东/深圳/宝安/龙华/民治 | /1/3/7/10/22 | 10 |
23 | 上塘 | /广东/深圳/宝安/龙华/上塘 | /1/3/7/10/23 | 10 |
(23 rows)
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有