2012-05-15 113 views
1

使用和我有一個簡單的查詢在having子句

select id, 
(select sum(totalin) from xorderextra where xorderextra.id = xoi.id) as totalin, 
from xorderinfo xoi 
group by xoi.id 
having (select sum(totalin) from xorderextra where xorderextra.id = xoi.id) > 1000 

現在我想知道有沒有更好的辦法來取代累加濾波器在其聲明。這是一個適當的方式來設置的東西,這會傷害一個查詢,即。它會不會總結數字兩次?

* 新情況*

select xoi.id, 
     sum(xex.totalin) as totalin, 
     sum(xooc.totalout) as totalout, 
from xorderinfo xoi 
inner join xorderextra xex on xex.id = xoi.id 
inner join xorderout xoo on xoo.rid = xoi.id 
inner join xorderoutcalc xooc on xooc.obracunid = xoo.obracunid 
group by xoi.id 
having sum(xex.totalin) > 1000 

這是返回錯誤的結果,我怎麼能解決這個問題?

回答

1

您可以加入並大幅提升性能!

select id, 
     sum(xex.totalin) as totalin, 
from xorderinfo xoi 
inner join xorderextra xex on xorderextra.id = xoi.id 
group by xoi.id 
having sum(xex.xorderextra) > 1000 
+0

什麼,如果我想在同一個查詢中使用(來自不同表)多資金?我相信使用連接不會返回正確的總和! – mko

+0

如果你想讓所有的人都在同一個專欄進行分組,它爲什麼不能工作? –

+0

不太確定,但我相信通過連接多個表格,您會得到重複的行。我試過上面添加的查詢,我得到不正確的總和。 – mko

1

你可以使用CTE和SUM OVER重寫它:

WITH cte AS(
    SELECT id 
    ,  SUM(xoi.totalin) OVER (PARTITION BY xoi.id) As TotalIn 
    FROM xorderinfo xoi 
) 
SELECT cte.* FROM cte 
WHERE TotalIn > 1000 
+0

這是一個很好的解決方案,但它不會降低性能? – mko

+0

@John:我希望它是最快的(假設合適的索引)。 –