DB2 With Clause

时间:2014-02-24 20:59:05

标签: sql db2 common-table-expression

我是DB2的新手,我对 with 子句有疑问。 例如,在以下查询中:

WITH values AS 
   (
      SELECT user_id, user_data FROM USER WHERE user_age < 20
   )       
SELECT avg(values.user_data) FROM values
UNION
SELECT sum(values.user_data) FROM values

公用表表达式执行多少次? with子句的结果是否会存储在临时表中,或者它会进行两次子选择。 (我在这里使用和结合只是为了举个例子,抱歉我的英语很差)

2 个答案:

答案 0 :(得分:1)

正如@Vladimir Oselsky所提到的,只看执行计划会给你一个明确的答案。在这个人为的例子中,CTE子选择可能会运行两次。

答案 1 :(得分:0)

在DB2中,公用表表达式应​​该在执行计划中创建公用表表达式节点(请参阅文档here)。这个节点明确地说:

  

它们充当中间表。传统上,嵌套表   表达也是为了这个目的。但是,一个常见的表   表达式可以在实例化后多次引用;   嵌套表表达式不能。

我读到这一点时说CTE只被评估一次,实例化,然后多次使用。此外,如果CTE仅被引用一次,则“实例化”将被优化掉。

请注意,这是Postgres处理CTE(物化子查询)的方式,而不是SQL Server处理它们的方式。