我知道我必须写SUM
两次,如果我想在HAVING
子句中使用它(否则要使用派生表):
SELECT id,
sum(hours) AS totalhours
FROM mytable
GROUP BY id
HAVING sum(hours) > 50;
我现在的问题是,这是否不是最理想的。作为程序员,该查询看起来像数据库将两次计算总和。是这样,还是我应该依靠数据库引擎为我做的优化?
更新:对类似查询的解释:
postgres=> explain select sum(counttodo) from orderline group by orderlineid having sum(counttodo) > 100;
QUERY PLAN
--------------------------------------------------------------------
HashAggregate (cost=1.31..1.54 rows=18 width=8)
Filter: (sum(counttodo) > 100)
-> Seq Scan on orderline (cost=0.00..1.18 rows=18 width=8)
(3 rows)
你可以发表解释吗?
—
Ste
...这就是为什么您不能仅在
—
dezso
HAVING
子句中引用聚合列的原因-但据我所知,在内部这是相反的方法。
@BartFriederichs好吧,很多人在这些行旁边抱怨(我也曾抱怨过,直到我不习惯它为止……)它没有执行两次,可能可以通过使用别名来实现
—
dezso
HAVING
(然后提取列定义)从SELECT
子句)-由于某种原因,他们只是不这样做。
我认为让数据库引擎担心优化应该是RDBMS实践者的第二天性。SQL是4GL,因此我们要定义所需的结果集,而不是实现它的方法。我们还有很多其他问题我们不必担心,例如连接顺序或将EXISTS转换为连接。从“不要重复自己”的角度讲,对于复杂的表达,这个特定问题更是一个问题,但是明智的解决方法(内联视图,CTE)可以帮助解决这些问题。
—
大卫·奥尔德里奇