http://blog.csdn.net/kongxx/article/details/47035491
在Postgresql的使用过程中发现了一个很有意思的功能,就是对于需要类似于树状结构的结果可以使用递归查询实现。比如说我们常用的公司部门这种数据结构,一般我们设计表结构的时候都是类似下面的SQL,其中parent_id为NULL时表示顶级节点,否则表示上级节点ID。
CREATE TABLE DEPARTMENT (
ID INTEGER PRIMARY KEY,
NAME VARCHAR(32),
PARENT_ID INTEGER REFERENCES DEPARTMENT(ID)
下面我们造几条测试数据
INSERT INTO DEPARTMENT(ID, NAME, PARENT_ID) VALUES(1, 'DEPARTMENT_1', NULL);
INSERT INTO DEPARTMENT(ID, NAME, PARENT_ID) VALUES(11, 'DEPARTMENT_11', 1);
INSERT INTO DEPARTMENT(ID, NAME, PARENT_ID) VALUES(12, 'DEPARTMENT_12', 1);
INSERT INTO DEPARTMENT(ID, NAME, PARENT_ID) VALUES(111, 'DEPARTMENT_111', 11);
INSERT INTO DEPARTMENT(ID, NAME, PARENT_ID) VALUES(121, 'DEPARTMENT_121', 12);
INSERT INTO DEPARTMENT(ID, NAME, PARENT_ID) VALUES(122, 'DEPARTMENT_122', 12);
其中
- DEPARTMENT_1是顶级节点,它有两个子节点DEPARTMENT_11和DEPARTMENT_12。
- DEPARTMENT_11节点又有一个子节点DEPARTMENT_111。
- DEPARTMENT_12节点有两个子节点DEPARTMENT_121和DEPARTMENT_122。
下面是递归查询生成树状结构查询语句
WITH RECURSIVE T (ID, NAME, PARENT_ID, PATH, DEPTH) AS (
SELECT ID, NAME, PARENT_ID, ARRAY[ID] AS PATH, 1 AS DEPTH
FROM DEPARTMENT
WHERE PARENT_ID IS NULL
UNION ALL
SELECT D.ID, D.NAME, D.PARENT_ID, T.PATH || D.ID, T.DEPTH + 1 AS DEPTH
FROM DEPARTMENT D
JOIN T ON D.PARENT_ID = T.ID
)
SELECT ID, NAME, PARENT_ID, PATH, DEPTH FROM T
ORDER BY PATH;
ID NAME PARENT_ID PATH DEPTH
1 DEPARTMENT_1 1 1
11 DEPARTMENT_11 1 1,11 2
111 DEPARTMENT_111 11 1,11,111 3
12 DEPARTMENT_12 1 1,12 2
121 DEPARTMENT_121 12 1,12,121 3
122 DEPARTMENT_122 12 1,12,122 3
转载请以链接形式标明本文地址
本文地址:http://blog.csdn.net/kongxx/article/details/47035491
分享到:
相关推荐
树PostgreSQL的递归查询树PostgreSQL的递归查询树PostgreSQL的递归查询
主要给大家介绍了关于PostgreSQL图(graph)的递归查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用PostgreSQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
主要介绍了在PostgreSQL中实现递归查询的教程,包括在递归查询内排序等方法的介绍,需要的朋友可以参考下
PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS)支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等。现在用户越来越多...
主要给大家介绍了关于PostgreSQL树形结构的递归查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用PostgreSQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
下载如有问题,可私信博主。下载前建议先查看博客内容,其地址为:https://blog.csdn.net/QQ98281642/article/details/120483897
postgresql 正则代替in查询 当需要参数查询时非常有用
PostgreSQL与MongoDB处理非结构化数据性能比较
PostgreSQL可以制定哪些SQL可以并行利用CPU的查询规划,用于增快SQL查询的响应速度。这个特性以并行查询而为大众所知。有些查询不能够从并行查询之中获益,要么受限于当前的实现,要么由于并行查询并不比串行查询...
查询sql的死锁进程,查找并杀死。解决生产数据库中卡死的现象。postgresql查询死锁以及杀死死锁进程sql
5.PostgreSQL数据库查询调优分享1
PostgresQL8.3 中文文档,添加了数据库复制功能的介绍。
SpringBoot配置Mybaits连接PostgreSql三层架构实现增改删。结构代码规范齐全,上传的是整个工作空间。
研究了PostgreSQL查询引擎...利用等价类的传递性,将一些非等值约束能够传递到其他的表列,最终可以实现减少资源耗用提升查询性能的目的。实验结果表明,改进后的PostgreSQL可以使得一些查询的效率有不同层次的提高。
Python编写PostgreSQL数据库结构比对程序源代码,该源代码导入PyCharm即可运行使用。
QGIS+postgresql操作,数据查询及导出导入 QGIS+postgresql操作,数据查询及导出导入 QGIS+postgresql操作,数据查询及导出导入
postgresql 8.3.1 source