与普通表表达式又名with
条款下工作的,我们可以命名一个子查询,并参考来自于我们的SQL语句中的任何位置这个子查询。更有意思的是,我们可以从查询本身引用查询,从而实现递归,这使得SQL可以完成语言。WITH子句Oracle中递归如何引擎盖
这个概念很简单,但我感兴趣的是如何在技术上甲骨文实现了调用堆栈,行和评价的渴望期限递归方面。
这里是行动递归with
条款的简单例子。它是强制递归的with
子句由两个成员组成:锚成员(初始行)和递归成员,由union all
运算符组合。
with numbers(val) as (
select 1 as val from dual
union all
select val + 1 from numbers
where val < 5
)
select val from numbers
将会产生
VAL
--
1
2
3
4
5
如何调用堆栈积累的结果集“看起来像”在这个例子吗?是否所有的逻辑结构是如何从SQL语句中得出的,但我只是不明白,或者Oracle有什么神奇的东西来解释这个语句来实现递归吗?
另外,为什么限制因素(where
子句)必须是在递归构件本身,而不是其中使用CTE?下面的尝试引发错误
with numbers(val) as (
select 1 as val from dual
union all
select val + 1 from numbers
)
select val from numbers where val < 5
和错误是
ORA-32044: cycle detected while executing recursive WITH query
这是否意味着Oracle不支持与公共表表达式懒惰的评价?相比之下,PostgreSQL中的以下工作。
WITH RECURSIVE t(v) AS (
SELECT 1 -- Seed Row
UNION ALL
SELECT v + 1 -- Recursion
FROM t
)
SELECT v
FROM t
LIMIT 5
这让我想起了使用终端操作进行懒惰评估的更多数据。这里与Oracle有什么技术区别?