假设有一个名为 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/