奇怪的 Oracle 行为 - 递归 CTE 中的交叉联接适用于逗号,但不适用于交叉联接子句

2024-01-08

假设以下简单的递归查询r列出几个数字。当查询的递归部分使用逗号分隔的旧方式与不必要的 1 行表交叉连接时,一切正常():

with r (x) as (
  select 1 as x from dual
  union all
  select x + 1 from r,dual where x < 5
)
select * from r

如果我将逗号更改为cross join条款,我得到ORA-32044: cycle detected while executing recursive WITH query error ():

with r (x) as (
  select 1 as x from dual
  union all
  select x + 1 from r cross join dual where x < 5
)
select * from r;

在 Oracle 11g(我的项目 db)和 Oracle 18(dbfiddle)上复制。这种情况被最小化了,最初是对图数据的分层查询,其中与表示边缘端点的2行的辅助关系以这种方式交叉连接。

我可以(不情愿地)接受第一种语法,尽管我对黑暗的无证角落或构建查询的 Oracle 有不好的感觉。我没有找到这种行为的任何原因,也没有发现错误的踪迹。有人知道吗?谢谢。


使用第一个递归查询,您将获得 5 条记录,当您尝试对递归结果进行交叉连接时,每次迭代数据时,对于根据值 5 的每次迭代,这些值都会相互循环,从而导致,ORA-32044: cycle detected while executing recursive WITH query错误。相反,您必须在递归结果之外交叉连接,如下所示,

with r (x) as (
  select 1 as x from dual
  union all
select x + 1 from r,dual where x < 5
)
select * from r
cross join r; 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

奇怪的 Oracle 行为 - 递归 CTE 中的交叉联接适用于逗号,但不适用于交叉联接子句 的相关文章

随机推荐