`

PostgreSQL递归查询实现树状结构查询

 
阅读更多
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
分享到:
评论
1 楼 TopLongMan 2016-08-06  
非常好,很实用啊。。

相关推荐

    PostgreSQL树形结构的递归查询示例

    本文将详细探讨如何在 PostgreSQL 中进行树形结构的递归查询,并通过具体的示例代码来展示其实现。 首先,我们需要构建一个简单的树形结构数据表。在这个例子中,我们创建了一个名为 `tree_data` 的表,包含以下...

    树形结构数据库设计

    在数据库中,我们通常使用递归关系或自连接来实现树形结构。 在SQL中,处理树形结构通常有两种主要方法:层次查询和路径枚举。层次查询使用START WITH和CONNECT BY语句(在Oracle中)或WITH RECURSIVE(在标准SQL及...

    Postgres-has-the-function-to-use.rar_postgres_postgresql

    PostgreSQL还支持递归函数,这对于处理树状数据结构或执行递归计算非常有用。不过需要注意防止无限递归。 十、函数安全性 函数可以被定义为安全的(SQL标准的安全级别)或不安全的(SQL标准的不稳定级别)。安全...

    数据表转化成树形结构

    部分数据库系统,如PostgreSQL,提供了内置的查询功能来直接生成树形结果,如`WITH RECURSIVE`语句。这种情况下,可以在SQL层面完成树形结构的构建,减轻应用程序的负担。 7. **实时更新**: 如果数据是实时更新...

    创建一个实现Disqus评论模版的MySQL模型

    在PostgreSQL中,递归查询是一种强大的工具,可以方便地处理树状结构。在MySQL中,我们可以通过自连接或者层次查询来模拟递归,但这种方法通常比较复杂,尤其是在处理大规模数据和多级嵌套时。 例如,如果我们想要...

    复杂需求的设计处理--五级之内发展的下线名单的归属

    当一个用户有多个下线时,就会形成一个树状结构,其中用户是节点,推荐关系是边。这个系统需要追踪每个用户的直接和间接下线,直到第五级。 接下来,我们关注“归属”问题。这可能指的是在销售或推广活动中,某个新...

    数据库-表-树节点读取.rar

    2. **递归查询**:为了读取这些树状数据,SQL提供了递归查询功能。例如,使用MySQL的`WITH RECURSIVE`语句或PostgreSQL的`WITH`语句,可以从根节点开始,遍历整棵树,获取所有子节点的信息。 3. **层次查询**:另一...

    php从数据库查询结果生成树形列表的方法

    我们可以使用递归函数来实现这个功能: ```php function generateTree($dbConnection, $parentId = null) { $result = $dbConnection->query("SELECT * FROM directory WHERE parent = $parentId"); $tree = []...

    动态生成菜单

    3. 实现递归函数,生成树状菜单结构。 4. 前端调用API,接收到数据后,利用前端框架的功能渲染菜单。 5. 结合路由配置,确保点击菜单时能正确跳转到对应页面。 四、性能优化 1. 分页加载:对于大型应用,可以...

    Laravel开发-nested-sets

    在实际开发中,嵌套集可以极大地简化多级导航或树状结构的处理。配合Laravel的Eloquent ORM,能够高效地完成各种层级数据的操作。但需要注意的是,当层级过深时,嵌套集可能会出现性能问题,这时可以考虑其他数据...

    在SQL中处理树结构

    总的来说,无论是PostgreSQL的ltree还是SQL Server的递归CTE,都能帮助我们有效地处理树形结构。通过合理利用这些特性,开发者可以轻松地在SQL中构建和查询复杂的层级数据模型。在设计和优化树结构相关的数据库方案...

    蓝滨新闻系统

    无限分类通常通过数据库中的递归关系实现,如自引用外键,或者使用像MPTT(Modified Preorder Tree Traversal)这样的算法来高效地存储和查询多级分类。 2. **JavaScript调用**: JavaScript在Web开发中扮演着关键...

    PHP4.3树形论坛

    【PHP4.3树形论坛】是一个基于PHP4.3版本构建的在线讨论平台,它采用了树状结构来展示论坛的帖子和回复,使得信息层次清晰,用户可以更直观地查看和参与讨论。在这样的论坛中,每个主题(thread)被视为一棵树的根...

Global site tag (gtag.js) - Google Analytics