10

我正在尝试提高一些查询性能,查询的结构如下:

select 'Total_amount', 
(select SUM(Total) from dbo.Invoices i where i.BU = bun.BU), 
case when (select SUM(Total) from dbo.Invoices i where i.BU = bun.BU) > 100000 then 'Good' else 'Not good' end 
from dbo.BusinessUnits bun

我知道这个例子可以使用连接来解决,但是在我的真实查询中我需要子查询。您可能会注意到,我有两次相同的子查询,一次提供实际值,另一次用于计算状态。

有没有办法通过只计算一次子查询来提高性能?

4

2 回答 2

8

您可以尝试像这样使用OUTER APPLY:-

select 'Total_amount', SumTotal, case when SumTotal > 100000 
then 'Good' else 'Not good' end 
from dbo.BusinessUnits bun 
OUTER APPLY (select SUM(Total) 
from dbo.Invoices i where i.BU = bun.BU) CA(SumTotal)

特别感谢马丁·史密斯指出!!

于 2013-09-20T15:22:30.470 回答
1

使用 WITH 的另一个选项

WITH total_table( 'Total_amount' )
AS
( SELECT SUM(Total) 
  FROM Invoices INNER JOIN  BusinessUnits ON (Invoices.BU = BusinessUnits.BU )
)

SELECT
   CASE WHEN Total_amount > 100000 then 'Good'
   ELSE 'Not good' 
   END
FROM
   total_table
于 2013-09-20T15:27:55.593 回答