2012-05-15 65 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:我希望它是最快的(假设合适的索引)。 –