一、背景
數據庫中存在父子關係的數據,如果要查它及所以子記錄,或者查它及所有父記錄數據,用遞歸查詢再合適不過了。通常我們的分級加載就可以用這個來實現。以地區表爲例來說明
二、建表、造數據
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;
結果:
五、參考