with递归
最近更新时间: 2025-02-18 16:02:00
postgres=# WITH RECURSIVE t_city AS
(
SELECT id, area FROM t_area WHERE id = 1
UNION ALL
SELECT
t_area.id,
t_city.area || ' > ' || t_area.area
FROM
t_city
INNER JOIN t_area ON t_area.pid = t_city.id
)
SELECT id,area FROM t_city order by area;
id | area
----+--------------------------
1 | 广东省
3 | 广东省 > 东莞市
8 | 广东省 > 东莞市 > 东城区
7 | 广东省 > 东莞市 > 南城区
2 | 广东省 > 深圳市
5 | 广东省 > 深圳市 > 福田区
6 | 广东省 > 深圳市 > 罗湖区
4 | 广东省 > 深圳市 > 南山区
执行non-recursive term,其结果作为recursive term中对t_city的引用,同时将这部分结果放入临时的working table中,重复执行如下步骤,直到working table为空,来看看具体过程:
- 执行
SELECT id, area FROM t_area WHERE id = 1
结果集和working table为
1 | 广东省
- 执行
SELECT
t_area.id,
t_city.area || ' > ' || t_area.area
FROM
t_city
INNER JOIN t_area ON t_area.pid = t_city.id
结果集和working table为
3 | 广东省 > 东莞市
2 | 广东省 > 深圳市
- 再次执行recursive query,结果集和working table为:
8 | 广东省 > 东莞市 > 东城区
7 | 广东省 > 东莞市 > 南城区
5 | 广东省 > 深圳市 > 福田区
6 | 广东省 > 深圳市 > 罗湖区
4 | 广东省 > 深圳市 > 南山区
- 继续执行recursive query,结果集和working table为空
- 结束递归,将执行过程结果合并,返回结果集。