PostgreSQL的递归查询(with recursive) ,替代oracle 的级联查询connect by
开发有需求,说需要对一张地区表进行递归查询,Postgres中有个 with recursive的查询方式,可以满足递归查询(一般>=2层)。 测试如下:
create table tb(id varchar(3) , pid varchar(3) , name varchar(10));
insert into tb values('002' , 0 , '浙江省');
insert into tb values('001' , 0 , '广东省');
insert into tb values('003' , '002' , '衢州市');
insert into tb values('004' , '002' , '杭州市') ;
insert into tb values('005' , '002' , '湖州市');
insert into tb values('006' , '002' , '嘉兴市') ;
insert into tb values('007' , '002' , '宁波市');
insert into tb values('008' , '002' , '绍兴市') ;
insert into tb values('009' , '002' , '台州市');
insert into tb values('010' , '002' , '温州市') ;
insert into tb values('011' , '002' , '丽水市');
insert into tb values('012' , '002' , '金华市') ;
insert into tb values('013' , '002' , '舟山市');
insert into tb values('014' , '004' , '上城区') ;
insert into tb values('015' , '004' , '下城区');
insert into tb values('016' , '004' , '拱墅区') ;
insert into tb values('017' , '004' , '余杭区') ;
insert into tb values('018' , '011' , '金东区') ;
insert into tb values('019' , '001' , '广州市') ;
insert into tb values('020' , '001' , '深圳市') ;
测试语句,查询浙江省及以下县市:
test=# with RECURSIVE cte as
test-# (
test(# select a.id,a.name,a.pid from tb a where id='002'
test(# union all
test(# select k.id,k.name,k.pid from tb k inner join cte c on c.id = k.pid
test(# )select id,name from cte;
id | name
-----+--------
002 | 浙江省
003 | 衢州市
004 | 杭州市
005 | 湖州市
006 | 嘉兴市
007 | 宁波市
008 | 绍兴市
009 | 台州市
010 | 温州市
011 | 丽水市
012 | 金华市
013 | 舟山市
014 | 上城区
015 | 下城区
016 | 拱墅区
017 | 余杭区
018 | 金东区
(17 rows)
如果查询有报错如死循环跳出,则需要检查下父字段与子字段的数据是否有相同。
如果想按层次分别显示出来,也可以这么写
| test=# with RECURSIVE cte as ( select a.id,cast(a.name as varchar(100)) from tb a where id='002' union all select k.id,cast(c.name||'>'||k.name as varchar(100)) as name from tb k inner join cte c on c.id = k.pid )select id,name from cte ; id | name -----+---------------------- 002 | 浙江省 003 | 浙江省>衢州市 004 | 浙江省>杭州市 005 | 浙江省>湖州市 006 | 浙江省>嘉兴市 007 | 浙江省>宁波市 008 | 浙江省>绍兴市 009 | 浙江省>台州市 010 | 浙江省>温州市 011 | 浙江省>丽水市 012 | 浙江省>金华市 013 | 浙江省>舟山市 014 | 浙江省>杭州市>上城区 015 | 浙江省>杭州市>下城区 016 | 浙江省>杭州市>拱墅区 017 | 浙江省>杭州市>余杭区 018 | 浙江省>丽水市>金东区 (17 rows) |
PS: MYSQL貌似还没出这么一种功能,
附带说一下SqlServer的的递归查询,语法类似,不过把recursive去掉就可以了,如:
with RECURSIVE cte as
(
select a.id,a.name,a.pid from tb a where id='002'
union all
select k.id,k.name,k.pid from tb k inner join cte c on c.id = k.pid
)select id,name from cte;
http://my.oschina.net/Kenyon/blog/55137 --出自此pgsql高手的博客
PostgreSQL的递归查询(with recursive) ,替代oracle 的级联查询connect by的更多相关文章
- Greenplum(PostgreSql)使用 with recursive 实现树形结构递归查询并插入新表
本代码目的是替代Oracle的connect by语句,并实现后者的path和idleaf功能. 正文开始: 假设表org,字段有 id(编号),name(名称),pid(上级编号), 最上级的记录p ...
- Oracle的分页查询语句优化
Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. (一) 分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT ...
- Oracle——多表查询
本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查询一起完成各个复杂查询的操作: 一 ...
- oracle的start with connect by prior
oracle的start with connect by prior是根据条件递归查询"树",分为四种使用情况: 第一种:start with 子节点ID='...' connec ...
- oracle的start with connect by prior如何使用
oracle的start with connect by prior是根据条件递归查询"树",分为四种使用情况: 第一种:start with 子节点ID='...' connec ...
- Oracle:Start with connect by prior 递归
SELECT * from CONNECT BY {PRIOR列名1=列名2|列名1=PRIOR列名2} [START WITH]; Oracle的递归查询: START WITH :描述开始 ...
- Oracle树形结构查询(递归)
引用:https://blog.csdn.net/u012615705/article/details/78321022 文章转自上述地址,内部有稍许改动,如有需要请查看原文. oracle树状结构 ...
- Oracle中start with...connect by (prior)子句的用法
connect by 是结构化查询中用到的,基本语法是:select … from tablenamestart with 条件1connect by 条件2where 条件3; 例:select * ...
- Oracle DBA常用查询
Oracle DBA常用查询 –1. 查询系统所有对象select owner, object_name, object_type, created, last_ddl_time, timestamp ...
随机推荐
- Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query
org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested ...
- 20180523模拟赛T4——Number
[题目描述] 最近
- 【转】Web测试中定位bug方法
在web测试过程中,经常会遇到页面中内容或数据显示错误,甚至不显示,第一反应就是BUG,进一步了解这个BUG的问题出在那里,是测试人员需要掌握的,可以简单的使用浏览器自带开发者工具.数据库工具配合去排 ...
- TCP拥塞避免
目录 TCP拥塞避免 超时重传机制 拥塞控制 慢启动 拥塞避免 快重传 快恢复 与流量控制区别 参考 TCP拥塞避免 拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载.拥塞 ...
- ssh ssm ssi 服务器平台架构
1.spring + springmvc + mybatis 使用maven构建,数据库是oracle,主要是温习mybatis配置以及与spring集成.这种框架目前是使用最广泛的,这里就不多说 2 ...
- c++、oc、swift初步评价
c++是面向对象的多态语言: oc是面向对象的动态语言: swift是面向对象.面向协议.高阶类型.函数式编程语言:
- 常用方法 DataTable转换为Entitys
备注:摘自网上 有附地址 public static List<T> DataTableToEntities<T>(this DataTable dt) where T : c ...
- CCF 201909-4 推荐系统
CCF 201909-4 推荐系统 试题编号: 201909-4 试题名称: 推荐系统 时间限制: 5.0s 内存限制: 512.0MB 问题描述: 算法设计 由于我们需要选出得分最大的K件商品,得出 ...
- 【转】Impala 中的 Invalidate Metadata 和 Refresh
前言Impala采用了比较奇葩的多个impalad同时提供服务的方式,并且它会由catalogd缓存全部元数据,再通过statestored完成每一次的元数据的更新到impalad节点上,Impala ...
- xsxsxs
def getdecrype(l): a= length="" ): if(l[a]=="x"): break else: length+=l[a] a+= h ...