1. 程式人生 > >postgresql with遞歸

postgresql with遞歸

pri content 方法 str func efault lai pos har

在PostgreSQL裏,with子句提供了一種方法寫一個大的查詢中使用的輔助報表與查詢。它有助於打破復雜和大型查詢簡單易讀的形式。

1. 建表
[sql] view plain copy
  1. postgres=# create table tb9(id serial primary key,name character varying, parentid integer);
  2. CREATE TABLE
[sql] view plain copy
  1. postgres=# \d tb9
  2. Table "public.tb9"
  3. Column | Type | Modifiers
  4. ----------+-------------------+--------------------------------------------------
  5. id | integer | not null default nextval(‘tb9_id_seq‘::regclass)
  6. name | character varying |
  7. parentid | integer |
  8. Indexes:
  9. "tb9_pkey" PRIMARY KEY, btree (id)
2. 插入測試數據
[sql] view plain copy
  1. postgres=# insert into tb9 values(generate_series(1,5),‘john‘,0);
  2. INSERT 0 5
  3. postgres=# insert into tb9 values(6,‘john1‘,1);
  4. INSERT 0 1
  5. postgres=# insert into tb9 values(7,‘john2‘,1);
  6. INSERT 0 1
  7. postgres=# insert into tb9 values(8,‘john11‘,6);
  8. INSERT 0 1
[sql] view plain copy
  1. postgres=# select * from tb9;
  2. id | name | parentid
  3. ----+--------+----------
  4. 1 | john | 0
  5. 2 | john | 0
  6. 3 | john | 0
  7. 4 | john | 0
  8. 5 | john | 0
  9. 6 | john1 | 1
  10. 7 | john2 | 1
  11. 8 | john11 | 6
  12. (8 rows)
3. with子句
[sql] view plain copy
  1. postgres=# with t as (select * from tb9 where parentid=1) select count(0) from t;
  2. count
  3. -------
  4. 2
  5. (1 row)
[sql] view plain copy
  1. postgres=# with t(a,b,c) as (select * from tb9 where parentid=1) select a,b,c from t;
  2. a | b | c
  3. ---+-------+---
  4. 6 | john1 | 1
  5. 7 | john2 | 1
  6. (2 rows)
4. 多個with子句的結合使用
parentid=1的記錄的所有子記錄
[sql] view plain copy
  1. postgres=# with t1 as (select * from tb9),t2 as(select * from tb9 where parentid=1) select t1.* from t1,t2 where t2.id=t1.parentid;
  2. id | name | parentid
  3. ----+--------+----------
  4. 8 | john11 | 6
  5. (1 row)
5. 遞歸
id為1的記錄的所有子記錄
[sql] view plain copy
  1. postgres=# with recursive t as(select id,name,parentid from tb9 where id=1 union all select k.id,k.name,k.parentid from tb9 k,t where t.id=k.parentid) select * from t;
  2. id | name | parentid
  3. ----+--------+----------
  4. 1 | john | 0
  5. 6 | john1 | 1
  6. 7 | john2 | 1
  7. 8 | john11 | 6
  8. 9 | john21 | 7
  9. (5 rows)


轉自 http://blog.csdn.net/luojinbai/article/details/44015581

postgresql with遞歸