循环检测递归SQL WITH子句

时间:2013-09-10 15:35:19

标签: sql oracle recursion

让我们假设我们有一个普通的分层表,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子句的递归问题?

0 个答案:

没有答案