我是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子句的结果是否会存储在临时表中,或者它会进行两次子选择。 (我在这里使用和结合只是为了举个例子,抱歉我的英语很差)
答案 0 :(得分:1)
正如@Vladimir Oselsky所提到的,只看执行计划会给你一个明确的答案。在这个人为的例子中,CTE子选择可能会运行两次。
答案 1 :(得分:0)
在DB2中,公用表表达式应该在执行计划中创建公用表表达式节点(请参阅文档here)。这个节点明确地说:
它们充当中间表。传统上,嵌套表 表达也是为了这个目的。但是,一个常见的表 表达式可以在实例化后多次引用; 嵌套表表达式不能。
我读到这一点时说CTE只被评估一次,实例化,然后多次使用。此外,如果CTE仅被引用一次,则“实例化”将被优化掉。
请注意,这是Postgres处理CTE(物化子查询)的方式,而不是SQL Server处理它们的方式。