PG里的层次查询方法

    今天开发人员咨询,他们项目有张表,表中的记录有父子关系,根据父记录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命令将结果输出到终端。
   
   最后将以上方法告诉开发人员,开发人员开心死了 ^_^

你可能感兴趣的:(PG里的层次查询方法)