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

时间: 2024-10-12 20:12:05

postgresql with递归的相关文章

Oracle 转 postgresql 递归 connect_by_isleaf 方案

oracle: SELECT user_number, LTRIM( SYS_CONNECT_BY_PATH ( NAME, ',' ), ',' ) NAME ,RN FROM ( SELECT u.user_number, r.NAME, ROW_NUMBER ( ) OVER ( PARTITION BY u.user_number ORDER BY ur.role_id ) RN FROM ems_role r, ( SELECT ur.user_id, ur.role_id FROM

PostgreSQL即学即用(第2版)pdf

下载地址: 网盘下载 内容简介 · · · · · · 本书将帮助你理解和使用PostgreSQL 这一开源数据库系统.你不仅会学到版本9.2.9.3 和9.4中的企业级特性,还会发现PostgreSQL 不只是个数据库系统,也是一个出色的应用平台.本书通过示例展示了如何实现在其他数据库中难以或无法完成的任务.这一版内容覆盖了LATERAL 查询.增强的JSON 支持.物化视图和其他关键话题. 作者简介  · · · · · · Regina Obe 是数据库咨询公司Paragon的负责人之一,

PostgreSQL继承详解

PostgreSQL实现了表继承,这个特性对数据库设计人员来说是一个很有效的工具.SQL99 及以后的标准定义了类型继承特性,和我们在这里描述的很多特性有区别. 让我们从一个例子开始:假设我们试图制作一个城市数据模型.每个州都有许多城市,但是只有一个首府.我们希望能够迅速检索任何州的首府.这个任务可以通过创建两个表来实现,一个是州府表,一个是非州府表.不过,如果我们不管什么城市都想查该怎么办? 继承的特性可以帮助我们解决这个问题.我们定义capitals表,它继承自cities表: CREATE

安装postgreSQL出现configure:error:readline library not found解决方法

要安装 readline , readline-dev 开发包,要么使用 --without-readline 选项关闭 readline 功能. #yum install readline; #yum install readline-dev; readline 也就是命令行编辑,关闭的话,你直接用psql 就不能编辑命令行,如果输错指令,不能回滚命令历史记录,只能手工重新输入. 在安装postgreSQL的过程中遇到一个问题,在执行 configure 过程中报以下错误,configure:

PostgreSQL 实现阶乘方法列举

PostgreSQL 功能庞大,对实现乘法这类运算有诸多的方法,今天我来简单列举下以下几种便捷的途径. 比如我们要计算10! 1. 可以用SQL给它展开: t_girl=# select 1*2*3*4*5*6*7*8*9*10 as mutiply_10; mutiply_10 ------------ 3628800 (1 row) Time: 0.854 ms 2. 用WITH递归 t_girl=# with recursive g(m,n) as t_girl-# (select 1 m

【原创】PostgreSQL 实现阶乘方法列举

PostgreSQL 功能庞大,对实现乘法这类运算有诸多的方法,今天我来简单列举下以下几种便捷的途径. 比如我们要计算10! 1. 可以用SQL给它展开: t_girl=# select 1*2*3*4*5*6*7*8*9*10 as multiply_10;      multiply_10  ------------     3628800 (1 row) Time: 0.854 ms 2. 用WITH递归 t_girl=# with recursive g(m,n) as  t_girl-

PostgreSQL代码分析,查询优化部分,canonicalize_qual

PostgreSQL代码分析,查询优化部分. 张大明白的blog:http://blog.csdn.net/shujiezhang 相关博文:PostgreSQL代码分析,查询优化部分,process_duplicate_ors /* * canonicalize_qual * Convert a qualification expression to the most useful form. * * The name of this routine is a holdover from a

PostgreSQL 对简单树的遍历

昨天我用MySQL来实现了ORACLE的递归语句CONNECT BY, 看起来稍复杂些.今天来看看POSTGRESQL如何实现ORACLE的CONNECT BY.还是用昨天同样的表以及数据.POSTGRESQL自诩最像ORACLE的数据库,所以大部分语句也就都可以简单而且变相的实现了.在这点上可以用他自己带的WITH递归功能,还可以用第三方扩展带来的类似connect by 函数. 先来看第一点,用递归的WITH来展现这棵树的路径. t_girl=# with recursive tmp_cou

【原创】PostgreSQL 对简单树的遍历

昨天我用MySQL来实现了ORACLE的递归语句CONNECT BY, 看起来稍复杂些.今天来看看POSTGRESQL如何实现ORACLE的CONNECT BY. 还是用昨天同样的表以及数据.POSTGRESQL自诩最像ORACLE的数据库,所以大部分语句也就都可以简单而且变相的实现了. 在这点上可以用他自己带的WITH递归功能,还可以用第三方扩展带来的类似connect by 函数. 先来看第一点,用递归的WITH来展现这棵树的路径. t_girl=# with recursive tmp_c