我有一个表,它表示对象之间的非循环依赖关系:
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的格式是灵活的。