让我们假设我们有一个普通的分层表,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
);
或按照此question的建议,自行进行循环检测。
但是有没有其他很好的解决方案(主要是针对Oracle而且还有其他数据库)解决了WITH子句的递归问题?