基于闭包表,能否用SQL实现指定顺序的树深度优先前序遍历?
基于闭包表实现树的深度优先前序遍历的SQL方案疑问
需要对树进行深度优先前序遍历,目标顺序为:
1
2
4
6
8
7
5
3
注意:节点的祖先未必拥有更小的节点编号。
闭包表数据
| 祖先 | 后代 | 路径长度 |
|---|---|---|
| 1 | 1 | 0 |
| 2 | 2 | 0 |
| 3 | 3 | 0 |
| 4 | 4 | 0 |
| 2 | 4 | 1 |
| 5 | 5 | 0 |
| 2 | 5 | 1 |
| 6 | 6 | 0 |
| 4 | 6 | 1 |
| 2 | 6 | 2 |
| 7 | 7 | 0 |
| 4 | 7 | 1 |
| 2 | 7 | 2 |
| 8 | 8 | 0 |
| 6 | 8 | 1 |
| 4 | 8 | 2 |
| 2 | 8 | 3 |
核心问题
是否可以通过SQL查询实现上述深度优先前序遍历顺序?
尝试的递归CTE方案
参考PostgreSQL文档7.8.2.1节「Search Order」,我写出了如下递归CTE查询:
WITH RECURSIVE search_tree(descendant, path) AS ( SELECT descendant, ARRAY[ROW(ct.ancestor, ct.descendant)] FROM closure_table ct WHERE descendant = 2 UNION ALL SELECT ct.descendant, path || ROW(ct.ancestor, ct.descendant) FROM closure_table ct, search_tree st WHERE ct.ancestor = st.descendant AND ct.path_length = 1 ) SELECT * FROM search_tree ORDER BY path;
疑问
不确定这个递归CTE方案的执行效率如何。
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

