PostgreSQL遞迴查詢實現樹狀結構查詢

2021-09-19 18:24:00 字數 3755 閱讀 4918

在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...