postgresql with递归
                        
                            时间:2021-07-01 10:21:17
                            帮助过:24人阅读
							                        
                     
                    
                    
                    
 
- postgres=# create table tb9(id serial primary key,name character varying, parentid integer);  
 
- CREATE TABLE  
 
[sql] view plain
 copy
 
- postgres=# \d tb9  
 
-                                Table "public.tb9"  
 
-   Column  |       Type        |                    Modifiers                       
 
-  id       | integer           | not null default nextval(‘tb9_id_seq‘::regclass)  
 
-  name     | character varying |   
 
-  parentid | integer           |   
 
- Indexes:  
 
-     "tb9_pkey" PRIMARY KEY, btree (id)  
 
2. 插入测试数据
[sql] view plain
 copy
 
- postgres=# insert into tb9 values(generate_series(1,5),‘john‘,0);  
 
- INSERT 0 5  
 
- postgres=# insert into tb9 values(6,‘john1‘,1);  
 
- INSERT 0 1  
 
- postgres=# insert into tb9 values(7,‘john2‘,1);  
 
- INSERT 0 1  
 
- postgres=# insert into tb9 values(8,‘john11‘,6);  
 
- INSERT 0 1  
 
[sql] view plain
 copy
 
- postgres=# select * from tb9;  
 
-  id |  name  | parentid   
 
-   1 | john   |        0  
 
-   2 | john   |        0  
 
-   3 | john   |        0  
 
-   4 | john   |        0  
 
-   5 | john   |        0  
 
-   6 | john1  |        1  
 
-   7 | john2  |        1  
 
-   8 | john11 |        6  
 
- (8 rows)  
 
3. with子句
[sql] view plain
 copy
 
- postgres=# with t as (select * from tb9 where parentid=1) select count(0) from t;  
 
-  count   
 
-      2  
 
- (1 row)  
 
[sql] view plain
 copy
 
- postgres=# with t(a,b,c) as (select * from tb9 where parentid=1) select a,b,c from t;  
 
-  a |   b   | c   
 
-  6 | john1 | 1  
 
-  7 | john2 | 1  
 
- (2 rows)  
 
4. 多个with子句的结合使用parentid=1的记录的所有子记录
[sql] view plain
 copy
 
- 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;  
 
-  id |  name  | parentid   
 
-   8 | john11 |        6  
 
- (1 row)  
 
5. 递归id为1的记录的所有子记录
[sql] view plain
 copy
 
- 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;  
 
-  id |  name  | parentid   
 
-   1 | john   |        0  
 
-   6 | john1  |        1  
 
-   7 | john2  |        1  
 
-   8 | john11 |        6  
 
-   9 | john21 |        7  
 
- (5 rows)  
 
 
 转自 http://blog.csdn.net/luojinbai/article/details/44015581
postgresql with递归
标签:key   一个   prim   not   too   oar   div   net   strong