让我们假设我们有正常的分层表,其中parent
列指向其父级。我想构建一个查询,该查询将使用 SQL WITH 子句枚举所有祖先。
with data_ancestors (par, chi) AS (
SELECT d.parent, d.dat_id
FROM data d
WHERE d.parent IS NOT NULL
UNION ALL
SELECT p.parent, a.chi
FROM dta_ancestors a
JOIN data p
ON p.dat_id = a.par
WHERE p.parent IS NOT NULL
)
select * from dta_ancestors where par = 1 order by chi;
这里的问题是,虽然数据不应该包含循环,但不能保证如此。在这种错误的情况下,我想逐渐降低功能(循环应该是任意破坏的)。然而,Oracle 在对“错误”数据执行期间以错误结束。
我知道我可以使用不同的更具体的 Oracle 方法,例如:
select p.dat_id, a.dat_id from data p, data a where a.dat_id in (
select d.dat_id from data d start with d.dat_id = p.dat_id connect by nocycle prior d.dat_id = d.parent
);
或按照this question中的建议自行进行循环检测。
但是,有没有其他很好的解决方案(主要针对 Oracle,也针对其他 DB)可以解决 WITH 子句的递归问题?