子查询/ CTE多次执行?

时间:2014-08-07 18:58:56

标签: sql-server sql-server-2008

查询计划显示CTE s被执行多次(在示例中为两次。这取决于它使用了多少次。)

create view V 
as
with s as (select max(A) A from AExpensiveView)
select count(*) 
from   T, s
where  T.A between s.A and s.A + 100

这是一种让它只执行一次的方法吗?它应该在视图或内联函数中,因此不能使用变量。

1 个答案:

答案 0 :(得分:0)

在这种情况下,有一种替代CTE可能有助于SQL服务器只执行一次。在不知道SQL服务器正在使用的情况下很难确定。无论你如何编写查询,它都会做它认为最好的事情。

SELECT COUNT(*)
FROM T
INNER JOIN
(
    SELECT
        MAX(A) AS A,
        MAX(A) + 100 AS B
    FROM s
) S ON T.A BETWEEN S.A AND S.B;