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 中进行树形结构的递归查询,并通过具体的示例代码来展示其实现。 首先,我们需要构建一个简单的树形结构数据表。在这个例子中,我们创建了一个名为 `tree_data` 的表,包含以下...
在数据库中,我们通常使用递归关系或自连接来实现树形结构。 在SQL中,处理树形结构通常有两种主要方法:层次查询和路径枚举。层次查询使用START WITH和CONNECT BY语句(在Oracle中)或WITH RECURSIVE(在标准SQL及...
PostgreSQL还支持递归函数,这对于处理树状数据结构或执行递归计算非常有用。不过需要注意防止无限递归。 十、函数安全性 函数可以被定义为安全的(SQL标准的安全级别)或不安全的(SQL标准的不稳定级别)。安全...
部分数据库系统,如PostgreSQL,提供了内置的查询功能来直接生成树形结果,如`WITH RECURSIVE`语句。这种情况下,可以在SQL层面完成树形结构的构建,减轻应用程序的负担。 7. **实时更新**: 如果数据是实时更新...
在PostgreSQL中,递归查询是一种强大的工具,可以方便地处理树状结构。在MySQL中,我们可以通过自连接或者层次查询来模拟递归,但这种方法通常比较复杂,尤其是在处理大规模数据和多级嵌套时。 例如,如果我们想要...
当一个用户有多个下线时,就会形成一个树状结构,其中用户是节点,推荐关系是边。这个系统需要追踪每个用户的直接和间接下线,直到第五级。 接下来,我们关注“归属”问题。这可能指的是在销售或推广活动中,某个新...
2. **递归查询**:为了读取这些树状数据,SQL提供了递归查询功能。例如,使用MySQL的`WITH RECURSIVE`语句或PostgreSQL的`WITH`语句,可以从根节点开始,遍历整棵树,获取所有子节点的信息。 3. **层次查询**:另一...
我们可以使用递归函数来实现这个功能: ```php function generateTree($dbConnection, $parentId = null) { $result = $dbConnection->query("SELECT * FROM directory WHERE parent = $parentId"); $tree = []...
3. 实现递归函数,生成树状菜单结构。 4. 前端调用API,接收到数据后,利用前端框架的功能渲染菜单。 5. 结合路由配置,确保点击菜单时能正确跳转到对应页面。 四、性能优化 1. 分页加载:对于大型应用,可以...
在实际开发中,嵌套集可以极大地简化多级导航或树状结构的处理。配合Laravel的Eloquent ORM,能够高效地完成各种层级数据的操作。但需要注意的是,当层级过深时,嵌套集可能会出现性能问题,这时可以考虑其他数据...
总的来说,无论是PostgreSQL的ltree还是SQL Server的递归CTE,都能帮助我们有效地处理树形结构。通过合理利用这些特性,开发者可以轻松地在SQL中构建和查询复杂的层级数据模型。在设计和优化树结构相关的数据库方案...
无限分类通常通过数据库中的递归关系实现,如自引用外键,或者使用像MPTT(Modified Preorder Tree Traversal)这样的算法来高效地存储和查询多级分类。 2. **JavaScript调用**: JavaScript在Web开发中扮演着关键...
【PHP4.3树形论坛】是一个基于PHP4.3版本构建的在线讨论平台,它采用了树状结构来展示论坛的帖子和回复,使得信息层次清晰,用户可以更直观地查看和参与讨论。在这样的论坛中,每个主题(thread)被视为一棵树的根...