如何优化具有相同子查询两次的查询?

Dan*_*nez 8 sql sql-server

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

Rah*_*thi 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)
Run Code Online (Sandbox Code Playgroud)

特别感谢MARTIN SMITH指出!!

  • `select'Total_amount',SumTotal,SumTotal> 100000时的情况然后'好'其他'不好'来自dbo.BusinessUnits bun OUTER APPLY(从dbo.Invoices中选择SUM(Total)i,其中i.BU = bun.BU) CA(SumTotal公司)` (2认同)