zoukankan      html  css  js  c++  java
  • postgresql with递归

    在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
  • 相关阅读:
    5.4.3 果园里的树
    5.3.2 字母重排
    5.3.1 6174问题
    Codeforces Round #253 (Div. 2), problem: (B)【字符串匹配】
    POJ1054 枚举【STL__binary_search()_的应用】
    432B
    0x3f3f3f3f...编程中无穷大常量的设置技巧
    2014年百度之星程序设计大赛 资格赛第一题 (longlong)
    Tarjan
    Dijkstra、Dij + heap、Floyd、SPFA、 SPFA + SLF Template
  • 原文地址:https://www.cnblogs.com/winkey4986/p/7493376.html
Copyright © 2011-2022 走看看