当前位置:   article > 正文

PostgreSql递归查询(WITH RECURSIVE)_with recursive as pg

with recursive as pg

一、背景

        数据库中存在父子关系的数据,如果要查它及所以子记录,或者查它及所有父记录数据,用递归查询再合适不过了。通常我们的分级加载就可以用这个来实现。以地区表为例来说明

二、建表、造数据

  1. CREATE TABLE place
  2. (
  3. id serial NOT NULL, --主键
  4. name character varying(200), --地区名
  5. parent_id bigint, --外键 父地区
  6. CONSTRAINT place_pkey PRIMARY KEY (id) --主键约束
  7. );
  8. insert into place(id,name,parent_id) values (1,'江苏省',0);
  9. insert into place(id,name,parent_id) values (101,'南京市',1);
  10. insert into place(id,name,parent_id) values (102,'无锡市',1);
  11. insert into place(id,name,parent_id) values (103,'徐州市',1);
  12. insert into place(id,name,parent_id) values (104,'常州市',1);
  13. insert into place(id,name,parent_id) values (105,'苏州市',1);
  14. insert into place(id,name,parent_id) values (1051,'昆山市',105);
  15. insert into place(id,name,parent_id) values (1052,'张家港市',105);
  16. insert into place(id,name,parent_id) values (1053,'常熟市',105);
  17. insert into place(id,name,parent_id) values (1054,'太仓市',105);

 全表数据长这样:

三、向下递归

这里查询江苏省及其下所有市县:

  1. WITH RECURSIVE r AS (
  2. SELECT * FROM place WHERE id = 1
  3. union ALL
  4. SELECT place.* FROM place, r WHERE place.parent_id = r.id
  5. )
  6. SELECT * FROM r ORDER BY id;

结果:

 

四、向上递归

查询最强县级市昆山市及以上记录:

  1. WITH RECURSIVE r AS (
  2. SELECT * FROM place WHERE id = 1051
  3. union ALL
  4. SELECT place.* FROM place, r WHERE place.id = r.parent_id
  5. )
  6. SELECT * FROM r ORDER BY id;

 结果:

五、参考

http://www.2cto.com/database/201309/242797.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/493092
推荐阅读
相关标签
  

闽ICP备14008679号