我正在尝试改进一些查询性能,查询的结构如下:
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
我知道这个例子可以使用连接解决,但在我的真实查询中我需要子查询。 正如您可能注意到的那样,我有两次相同的子查询,一个用于给出实际值,另一个用于计算状态。
有没有办法通过计算一次子查询来提高性能?
答案 0 :(得分:7)
您可以尝试使用 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)
特别感谢 MARTIN SMITH 指出!!
答案 1 :(得分:1)
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