sql - SQL中的树深度

标签 sql optimization query-optimization

假设有一个名为 tree_node 的表,具有名为 id 的主键并且有一个名为 parent_id 的可为空的列并且该表嵌入了树结构(或森林),如何在 SQL 中以有效的方式计算树/森林中节点的深度?

最佳答案

您将需要递归能力。使用递归查询,这将是:

WITH RECURSIVE node_ancestors(node_id, parent_id) AS (
        SELECT id, id FROM tree_node WHERE id IN (1, 2, 3)
    UNION ALL
        SELECT na.node_id, tree_node.parent_id
            FROM node_ancestors AS na, tree_node
            WHERE tree_node.id = na.parent_id AND tree_node.parent_id IS NOT NULL
)
SELECT node_id, COUNT(parent_id) AS depth FROM node_ancestors GROUP BY node_id;

其他选项是在存储过程中进行递归,在应用程序中进行递归并限制递归量和使用大量连接。 (最后一个选项对于非平凡的深度并不是很有效)

关于sql - SQL中的树深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1330828/

相关文章:

Mysql - 加速 200 万行的选择查询

MySQL查询优化从大表中获取8-10条记录

mysql - 在 MySQL 中处理多个时区

python - 更有效的方法来做到这一点

mysql - 了解 MySQL 查询优化器

mysql - 获取有多少用户响应了调查

mysql - 从数据库表中检索最小和最大字符串

java - Spring Batch - 有没有办法创建既不读取也不写入的存储过程步骤?

带有 SUM 和 WHERE 的 Mysql 查询不起作用

java - HashMap复合键-停止每次调用时创建键对象的解决方案