postgresql with遞迴

來源:互聯網
上載者:User

標籤:key   一個   prim   not   too   oar   div   net   strong   

在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遞迴

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.