在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 App解决卡顿慢之内存抖动及内存泄漏(发现和定位)

    内存抖动是指在短时间内有大量的对象被创建或者被回收的现象,内存抖动出现原因主要是频繁(很重要)在循环里创建对象(导致大量对象在短时间内被创建,由于新对象是要占用内存空间的而且是频繁,如果一次或者两次在 ...

  2. iOS UILabel设置居上对齐,居中对齐,居下对齐

    在iOS中默认的UILabel中的文字在竖直方向上仅仅能居中对齐,博主參考国外站点.从UILabel继承了一个新类,实现了居上对齐,居中对齐,居下对齐.详细例如以下: // //  myUILabel ...

  3. [转]Greenplum的工作负载及资源管理

    工作负载及资源管理 查询分析-查看EXPLAIN输出 EXPLAIN输出一个计划为节点组成的树 每个节点表示一个独立的操作 计划应该从下向上读,每个节点得到的记录向上传递 成本评估项: cost - ...

  4. appium 重新启动apk

    在旧版本的appium,重新启动apk,调用startActivity方法可以随意启动一个app,并传入一个package name 和启动activity name的名称.语句如下: driver. ...

  5. java 中获得 资源文件方法

    1 java 中获取资源文件的方法 项目目录如下 获取当前项目的目录路径 方法一:使用类名 MergeDocHandler.class.getClassLoader().getResource(&qu ...

  6. django 学习之model操作(想细化)

    一.Field选项 null=True 数据库为空 blank=True admin相关为空 choices:choices意味着静态数据的变化不会太大. db_column: 用于此字段的数据库的列 ...

  7. django admin 根据choice字段选择的不同来显示不同的页面

    一.举例 tip/tip.js var react = function () { if (django.jQuery('#id_tiptype').val() == 'content') { dja ...

  8. supervisor 安装脚本

    mkdir /data/tools && cd /data/tools wget --no-check-certificate https://bootstrap.pypa.io/ez ...

  9. [hihoCoder] 第四十九周: 欧拉路·一

    题目1 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最 ...

  10. 【Android】1.1 开发环境安装和配置

    分类:C#.Android.VS2015: 创建日期:2016-01-20 2016-08-03说明:此版本已过时,最新版本见本博客置顶的内容. 一.安装JDK.SDK.NDK 无论是用C#和VS20 ...