oracle - With 子句执行

标签 oracle sybase teradata common-table-expression netezza

我一直认为 With 子句作为一次性执行语句工作,其行为与普通表一样 - 您可以像在常规表上一样对其执行所有 SQL 操作.

但事实证明,在多个数据库(Oracle、Netezza、Sybase、Teradata)中,with 子句每次使用时都会执行。

 With Test as(

    select random() --pseudo code

)
select '1st select', * from Test
union
select '2nd select', * form Test

上面的查询返回 2 个不同的数字,而不是 2 个相同的数字,因此它会针对每个选择执行。

如果我在 With 子句中有一个非常复杂的查询,并且我在查询的其余部分中使用它 5 次,那么它将执行 5 次,这对我来说似乎非常无效。

那么有人可以给我一个很好的逻辑理由吗?

最佳答案

至少在 Teradata 中它按预期工作,随机值仅计算一次:

With Test as(
   select random(1,1000000) as x --pseudo code
)
select '1st select', x from Test
union
select '2nd select', x from Test
;

 *** Query completed. 2 rows found. 2 columns returned.
 *** Total elapsed time was 1 second.

'1st select'            x
------------  -----------
1st select         422654
2nd select         422654

关于oracle - With 子句执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38632157/

相关文章:

spring - 有没有办法使用 Spring Integration 的 jdbc :oubound-channel-adapter? 编写 BLOB

python - user_tables 如何锁定在 Oracle 上?

oracle - 比较来自两个不同数据库的表 SQL Developer

sql - Sybase运行时错误处理

java - 如何在不循环的情况下将 Java 中的结果集拆分为 block (每个 block 500 行)?

oracle - 读取Oracle数据库时,在Proc SQL的where子句中使用数据集观察

ios - 为数据库设置加密 key (Sybase 无线平台)

hadoop - HIVE中的期间数据类型支持到TERADATA导出

sql - 创建具有自动递增字段和引用完整性约束的 volatile 表

loops - 在Teradata中捕获插入错误