我有一个表,它表示对象之间的非循环依赖关系:
CREATE TEMPORARY TABLE dependencies ( obj_id bigint, depended_upon bigint NULL ); INSERT INTO dependencies VALUES (1, NULL), -- 1 is not depended upon by any other object (2, 1), -- 1 depends on 2 (3, 4), -- 4 depends on 3 (3, 2), -- ... and so does 2 (4, NULL); -- 4 also is not depended upon by any other object
我想确定修剪对象的顺序,以便从叶子开始不违反依赖关系。对于本例,结果如下所示:
Object ID | Prune step |
---|---|
4 | 0 |
1 | 0 |
2 | 1 |
3 | 2 |
每个对象在第一步中都会被修剪,在第一步,没有其他对象依赖于它。
我尝试过用递归CTE来实现这一点:
WITH RECURSIVE deletion_order(obj_id, step) AS ( SELECT obj_id, 0 FROM dependencies GROUP BY obj_id HAVING COUNT(depended_upon) = 0 UNION ALL SELECT dependencies.obj_id, step + 1 FROM dependencies LEFT JOIN deletion_order ON dependencies.depended_upon = deletion_order.obj_id WHERE deletion_order.obj_id IS NULL ) SELECT * FROM deletion_order ORDER BY step;
但Postgres抱怨道:
[42P19]错误:对查询“deletion_order”的递归引用不能出现在外部联接中
如果没有外部连接,我如何实现这一点?请注意,如果需要更改以适应解决方案,dependencies
的格式是灵活的。