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命令将结果输出到终端。

最后将以上方法告诉开发人员,开发人员开心死了 ^_^

分类:数据库 时间:2015-05-12 人气:359
本文关键词:
分享到:

相关文章

iOS 开发

Android 开发

Python 开发

JAVA 开发

开发语言

PHP 开发

Ruby 开发

搜索

前端开发

数据库

开发工具

开放平台

Javascript 开发

.NET 开发

云计算

服务器

Copyright (C) codeweblog.com, All Rights Reserved.

CodeWeblog.com 版权所有 闽ICP备15018612号

processed in 0.031 (s). 12 q(s)