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为空
  • 结束递归,将执行过程结果合并,返回结果集。