在postgresql的使用過程中發現了乙個很有意思的功能,就是對於需要類似於樹狀結構的結果可以使用遞迴查詢實現。比如說我們常用的公司部門這種資料結構,一般我們設計表結構的時候都是類似下面的sql,其中parent_id為null時表示頂級節點,否則表示上級節點id。
create
table department ( id integer
primary
key, name varchar(32), parent_id integer
references department(id));
下面我們造幾條測試資料
insert
into department(id, name, parent_id) values(1, 'department_1', null);
insert
into department(id, name, parent_id) values(11, 'department_11', 1);
insert
into department(id, name, parent_id) values(12, 'department_12', 1);
insert
into department(id, name, parent_id) values(111, 'department_111', 11);
insert
into department(id, name, parent_id) values(121, 'department_121', 12);
insert
into department(id, name, parent_id) values(122, 'department_122', 12);
其中
- department_1是頂級節點,它有兩個子節點department_11和department_12。
- department_11節點又有乙個子節點department_111。
- department_12節點有兩個子節點department_121和department_122。
下面是遞迴查詢生成樹狀結構查詢語句
with recursive t (id, name, parent_id, path, depth) as ( select id, name, parent_id, array[id] as path, 1
as depth from department where parent_id is
null
union
allselect d.id, d.name, d.parent_id, t.path || d.id, t.depth + 1
as depth from department d join t on d.parent_id = t.id ) select id, name, parent_id, path, depth from torder
by path;
id name parent_id path depth1 department_1 1 111 department_11 1 1,11 2111 department_111 11 1,11,111 312 department_12 1 1,12 2121 department_121 12 1,12,121 3122 department_122 12 1,12,122 3
在postgresql的使用過程中發現了乙個很有意思的功能,就是對於需要類似於樹狀結構的結果可以使用遞迴查詢實現。比如說我們常用的公司部門這種資料結構,一般我們設計表結構的時候都是類似下面的sql,其中parent_id為null時表示頂級節點,否則表示上級節點id。
create
table department ( id integer
primary
key, name varchar(32), parent_id integer
references department(id));
下面我們造幾條測試資料
insert
into department(id, name, parent_id) values(1, 'department_1', null);
insert
into department(id, name, parent_id) values(11, 'department_11', 1);
insert
into department(id, name, parent_id) values(12, 'department_12', 1);
insert
into department(id, name, parent_id) values(111, 'department_111', 11);
insert
into department(id, name, parent_id) values(121, 'department_121', 12);
insert
into department(id, name, parent_id) values(122, 'department_122', 12);
其中
- department_1是頂級節點,它有兩個子節點department_11和department_12。
- department_11節點又有乙個子節點department_111。
- department_12節點有兩個子節點department_121和department_122。
下面是遞迴查詢生成樹狀結構查詢語句
with recursive t (id, name, parent_id, path, depth) as ( select id, name, parent_id, array[id] as path, 1
as depth from department where parent_id is
null
union
allselect d.id, d.name, d.parent_id, t.path || d.id, t.depth + 1
as depth from department d join t on d.parent_id = t.id ) select id, name, parent_id, path, depth from torder
by path;
id name parent_id path depth1 department_1 1 111 department_11 1 1,11 2111 department_111 11 1,11,111 312 department_12 1 1,12 2121 department_121 12 1,12,121 3122 department_122 12 1,12,122 3
postgreSQL 遞迴查詢,使用陣列
遞迴查詢使用with recursive 陣列使用array 運用場景 用於統計多個層級中某乙個層級以及下面所有分類的資料 表結構 drop table if exists public test tree create table public test tree id int4 not null...
PostgreSQL 遞迴查詢應用場景
今天在罈子裡有人提出了乙個問題,問題是這樣的 在以下指定表中 id name fatherid 1 中國 0 2 遼寧 1 3 山東 1 4 瀋陽 2 5 大連 2 6 濟南 3 7 和平區 4 8 沈河區 4 現在給定乙個id號,想得到它完整的名字。如 當id 7時,名字是 中國遼寧瀋陽和平區 當...
PostgreSQL遞迴查詢(從子到父 從父到子)
結語場景 資料庫中的資料存在父子關係 單繼承,每一條記錄只有乙個父記錄 如果要查詢一條記錄以及他的所有子記錄,或者要查詢一條記錄以及他的所有父記錄.那麼遞迴查詢就再合適不過了.可以簡化複雜的sql語句。現在資料庫有一張dictionary表,用於存放業務相關字典項 id,name,parent id...