注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PG里的层次查询方法  

2010-12-08 13:57:21|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


          今天开发人员咨询,他们项目有张表,表中的记录有父子关系,根据父记录ID,如何查询所有
子节点的记录, PG里是否有方法可以实现, 听到这,我还是第一次碰到PG的这种问题,想到Oracle
是有方法实现的,查询语法如下:

--像oracle里,查询语法如下
select * from aclorgtreeinfo
start with orgid = '06e0d0bb1389a196011389b31abd0002'
connect by prior orgid = parentorgid;

     后来查了些文档发现PG里可以利用递归查询实现,具体用法可以参考
http://www.postgresql.org/docs/8.4/static/queries-with.html,  以下是具体测试过程。

--创建测试表,并插入测试记录
create table emp (empid integer,empparid integer,empname varchar(32));
insert into emp values (001,nul,'CEO');
insert into emp values (002,001,'CTO');
insert into emp values (003,001,'CFO');
insert into emp values (004,001,'OOO');
insert into emp values (005,002,'MANAGER');

mydb=> select * from emp;
 empid | empparid | empname
-------+----------+---------
     2 |        1 | CTO
     3 |        1 | CFO
     4 |        1 | OOO
     5 |        2 | MANAGER
    

--查询empid=2下的所有记录
WITH RECURSIVE r AS (
       SELECT * FROM emp WHERE empid = 2
     union   ALL
       SELECT emp.* FROM emp, r WHERE emp.empparid = r.empid
     )
SELECT * FROM r ORDER BY empid;

 empid | empparid | empname
-------+----------+---------
     2 |        1 | CTO
     5 |        2 | MANAGER
(2 rows)

           从结果看出,果然功能实现了,"WITH RECURSIVE"有个特点,它不立即将执行结果输出,而是需要再通过
  SELECT命令将结果输出到终端。
  
   最后将以上方法告诉开发人员,开发人员开心死了 ^_^

  评论这张
 
阅读(26463)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016