0

让我们假设我们有正常的分层表,其中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 子句的递归问题?

4

0 回答 0