PG里的层次查询方法

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

1
2
3
select * from aclorgtreeinfo  
start with orgid = '06e0d0bb1389a196011389b31abd0002'
connect by prior orgid = parentorgid;

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

创建测试表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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下的所有记录

1
2
3
4
5
6
7
8
9
10
11
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 命令将结果输出到终端。

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

原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/236342.html

(0)
上一篇 2022年1月24日
下一篇 2022年1月24日

相关推荐

发表回复

登录后才能评论