PostgreSql遞歸查詢(WITH RECURSIVE)

一、背景

        數據庫中存在父子關係的數據,如果要查它及所以子記錄,或者查它及所有父記錄數據,用遞歸查詢再合適不過了。通常我們的分級加載就可以用這個來實現。以地區表爲例來說明

二、建表、造數據

CREATE TABLE place
(
  id serial NOT NULL,                    --主鍵
  name character varying(200),           --地區名
  parent_id bigint,                      --外鍵  父地區
  CONSTRAINT place_pkey PRIMARY KEY (id) --主鍵約束
);
insert into place(id,name,parent_id) values (1,'江蘇省',0);
insert into place(id,name,parent_id) values (101,'南京市',1);
insert into place(id,name,parent_id) values (102,'無錫市',1);
insert into place(id,name,parent_id) values (103,'徐州市',1);
insert into place(id,name,parent_id) values (104,'常州市',1);
insert into place(id,name,parent_id) values (105,'蘇州市',1);
insert into place(id,name,parent_id) values (1051,'崑山市',105);
insert into place(id,name,parent_id) values (1052,'張家港市',105);
insert into place(id,name,parent_id) values (1053,'常熟市',105);
insert into place(id,name,parent_id) values (1054,'太倉市',105);

 全表數據長這樣:

三、向下遞歸

這裏查詢江蘇省及其下所有市縣:

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

結果:

 

四、向上遞歸

查詢最強縣級市崑山市及以上記錄:

WITH RECURSIVE r AS (
     SELECT * FROM place WHERE id = 1051
     union   ALL
     SELECT place.* FROM place, r WHERE place.id = r.parent_id
)
SELECT * FROM r ORDER BY id;

 結果:

五、參考

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章