Я знаю, что должен написать 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)
HAVING
предложении - но, насколько я понимаю, внутренне это делается скорее наоборот.
HAVING
(а затем извлечение определения столбца из SELECT
пункта) - по какой-то причине они просто не делают этого.