我一直认为 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/