今天开发人员咨询,他们项目有张表,表中的记录有父子关系,根据父记录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