PG里的层次查询方法
博客专区 > GameKing 的博客 > 博客详情
PG里的层次查询方法
GameKing 发表于3年前
PG里的层次查询方法
  • 发表于 3年前
  • 阅读 32
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 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命令将结果输出到终端。
   
   最后将以上方法告诉开发人员,开发人员开心死了 ^_^

共有 人打赏支持
粉丝 23
博文 20
码字总数 20400
作品 1
×
GameKing
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: