查询计划显示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
这是一种让它只执行一次的方法吗?它应该在视图或内联函数中,因此不能使用变量。
答案 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;