在PostgreSQL里,with子句提供了一种方法写一个大的查询中使用的辅助报表与查询。它有助于打破复杂和大型查询简单易读的形式。

1. 建表

  1. postgres=# create table tb9(id serial primary key,name character varying, parentid integer);
  2. CREATE TABLE
  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. 插入测试数据

  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
  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子句

  1. postgres=# with t as (select * from tb9 where parentid=1) select count(0) from t;
  2. count
  3. -------
  4. 2
  5. (1 row)
  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的记录的所有子记录

  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的记录的所有子记录

  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递归的更多相关文章

  1. MVCC PostgreSQL实现事务和多版本并发控制的精华

    原创文章,同步发自作者个人博客,http://www.jasongj.com/sql/mvcc/ PostgreSQL针对ACID的实现机制 事务的实现原理可以解读为RDBMS采取何种技术确保事务的A ...

  2. PostgreSQL中RECURSIVE递归查询使用总结

    RECURSIVE 前言 CTE or WITH 在WITH中使用数据修改语句 WITH使用注意事项 RECURSIVE 递归查询的过程 拆解下执行的过程 1.执行非递归部分 2.执行递归部分,如果是 ...

  3. 一道Postgresql递归树题

    转载请注明出处: https://www.cnblogs.com/funnyzpc/p/13698249.html 也是偶然的一次,群友出了一道题考考大家,当时正值疫情最最严重的三月(借口...),披 ...

  4. PostgreSQL 与 MySQL 相比,优势何在?

    一. PostgreSQL 的稳定性极强, Innodb 等引擎在崩溃.断电之类的灾难场景下抗打击能力有了长足进步,然而很多 MySQL 用户都遇到过Server级的数据库丢失的场景——mysql系统 ...

  5. postgresql查询的处理过程

    本文简单描述了Postgresql服务器接收到查询后到返回给客户端结果之间一般操作顺序,总的流程图如下: 第一步: 客户端程序可以是任何符合 PostgreSQL 协议规范的程序,如 JDBC 驱动. ...

  6. PostgreSQL笔记

    本文针对目前最新版9.5.1,若非说明,文中所说文档即指官方文档.本人刚接触PostgreSQL不久,文中不免错漏,请大家指正:随着了解深入,本文[可能]会不定期更新补足. JSON PostgreS ...

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

    要安装 readline , readline-dev 开发包,要么使用 --without-readline 选项关闭 readline 功能. #yum install readline; #yu ...

  8. 跟我一起读postgresql源码(七)——Executor(查询执行模块之——数据定义语句的执行)

    1.数据定义语句的执行 数据定义语句(也就是之前我提到的非可优化语句)是一类用于定义数据模式.函数等的功能性语句.不同于元组增删査改的操作,其处理方式是为每一种类型的描述语句调用相应的处理函数. 数据 ...

  9. 跟我一起读postgresql源码(八)——Executor(查询执行模块之——可优化语句的执行)

    2.可优化语句的执行 可优化语句的共同特点是它们被查询编译器处理后都会生成査询计划树,这一类语句由执行器(Executor)处理.该模块对外提供了三个接口: ExecutorStart.Executo ...

随机推荐

  1. android studio 如何让包名展开

    通常我们新建一个包名的时候,会发现他们连在一起,根本无法在创建一个同级的包 工具/原料   电脑,android studio 方法/步骤     1,我们先在包名下建一个包,变成了这样,根本无法在同 ...

  2. VC CListCtrl 第一列列宽自适应

    原文链接: http://www.cnblogs.com/sephil/archive/2011/04/03/2004384.html 今天用VC写工具的时候用到CListView,并且ListCtr ...

  3. pdm画表间结构

    PDM(物理概念模型)各种属性建立如PK,AK等 https://blog.csdn.net/qq_27376871/article/details/51321609 CDM: ER图详细教程 通常在 ...

  4. 【转载并整理】javaweb单点登录

    很好的一篇,讲述原理的文章: http://www.importnew.com/22863.html https://www.cnblogs.com/Leo_wl/p/6111623.html 京东s ...

  5. Spring-MVC配置Gson做为Message Converter解析Json

    Spring-MVC配置Gson做为Message Converter解析Json 在学习Spring的时候看到可以使用@RequestBody 和@ResponseBody注解来是的Spring自动 ...

  6. java 泛型中class<T> 和T的区别是什么?

    public <T> boolean edit(T entity) 和public <T> T get(Class<T> c, Serializable id)中这 ...

  7. macbook安装homebrew并更换清华源

    1.官网brew.sh复制安装脚本. 2.自动安装完成后,更换为清华源来加快速度.网址为:https://mirrors.tuna.tsinghua.edu.cn/help/homebrew 3.更换 ...

  8. 不错位的java .class 反编译工具推荐

    我们经常会反编译看一些class文件,但是反编译出来的文件里面会有很多杂乱的东西 一直以来都是用的idea来反编译的,只要把class文件往里面一拖就行了 这么用没问题,用来看看源码什么的都OK 但是 ...

  9. VS2017中建立ASP.NET MVC 4.0项目

    新的项目需要运行在WIN2003上,又不想用ASPX了,只好用回ASP.NET MVC4.0了,可是在VS2017中已经没有MVC4的模板了,网上下载的安装了也没有,只好把以前的MVC4的项目拿 出来 ...

  10. Java常考面试题(三)

    序言 说说今天遇到的一件小事吧,在遇到问题,查找答案时,看到很多人的博客里面都有提到关键字眼,可让人觉得可恨的是,大多数人写的博文中,基本上都是照着书上的语言发表的,看了跟没看一样,没有一点通俗的语言 ...