So che devo scrivere SUM
due volte, se desidero usarlo in una HAVING
clausola (o utilizzare una tabella derivata altrimenti):
SELECT id,
sum(hours) AS totalhours
FROM mytable
GROUP BY id
HAVING sum(hours) > 50;
La mia domanda ora è, se questo non è ottimale. Come programmatore, questa query sembra che il DB calcolerà la somma due volte. È così o dovrei fare affidamento sulle ottimizzazioni che il motore DB farà per me?
Aggiornamento: una spiegazione di una query comparabile:
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)
HAVING
clausola - ma, per quanto ne sappia, internamente questo è piuttosto fatto al contrario.
HAVING
(e quindi tirando la definizione della colonna dalla SELECT
clausola) - per qualche motivo non lo fanno.