Вот настройка:
.open ':memory:'
CREATE TABLE foos (x INTEGER);
INSERT INTO foos (x)
VALUES (1), (1), (2), (1), (3), (2);
Это запрос (назовем его query1)
SELECT x, count(x)
FROM foos
GROUP BY x
HAVING count(x) > 1;
медленнее, чем этот запрос (query2):
SELECT x, count(x) AS xcnt
FROM foos
GROUP BY x
HAVING xcnt > 1;
Другими словами, возвращаемое значение query1count(x) неявно запоминается и повторно используется в предложении HAVING, или оно действительно вызывается дважды?
Результатом вышеизложенного является
1|3
2|2
1|3
2|2
Обновлено:
Поместив EXPLAIN QUERY PLAN над выходами обоих запросов:
0|0|0|SCAN TABLE foos
0|0|0|USE TEMP B-TREE FOR GROUP BY
0|0|0|SCAN TABLE foos
0|0|0|USE TEMP B-TREE FOR GROUP BY
@MitchWheat Я внес правки, чтобы прояснить свой пост, и добавил информацию, которую вы просили

Это один и тот же запрос.
Кроме того, вам, вероятно, следует создать индекс на x.
Хм, для записи это был не я. Я нашел ваш ответ ясным и полезным. Я поддержу ваш ответ, чтобы уравновесить весы.
что происходит, когда вы их запускаете? Объясните план: sqlite.org/eqp.html