Давайте помнить, что поскольку язык SQL описывает то, что вы хотите, а не то, как его получить, существует много способов выражения запроса, который в конечном итоге будет превращен в один и тот же план выполнения запроса хорошим оптимизатором запросов. Конечно, уровень «хорошо» зависит от базы данных, которую вы используете.
Как правило, подзапросы представляют собой синтаксически иной способ описания объединений. Оптимизатор запросов распознает это и определит наиболее оптимальный способ выполнения запроса. Временные таблицы могут быть созданы по мере необходимости. Поэтому во многих случаях повторная обработка запроса ничего не изменит для вашего фактического времени выполнения - в конечном итоге он может оказаться в том же плане выполнения запроса.
Если вы собираетесь попытаться оптимизировать, вам нужно изучить план запроса, выполнив описание этого запроса. Убедитесь, что он не выполняет полное сканирование больших таблиц, и выбирает соответствующие индексы, где это возможно. Если и только если он делает здесь неоптимальный выбор, попытайтесь вручную оптимизировать запрос.
Теперь, после всего сказанного, вставленный вами запрос не полностью совместим с вашей заявленной целью «подсчета [количества] различных идентификаторов для каждого данного значения». Так что извините, если я не совсем отвечаю на ваши запросы, но вот что нужно протестировать против вашего текущего запроса. (Синтаксис приблизительный, извините - подальше от моего стола).
SELECT [IDs].[Id], vh1.[CurrentValue], COUNT(vh2.[CurrentValue]) FROM
[IDs].[Id] as ids JOIN [ValueHistory] AS vh1 ON ids.[Id]=vh1.[Id]
JOIN [ValueHistory] AS vh2 ON vh1.[CurrentValue]=vh2.[CurrentValue]
GROUP BY [Id], [LastValue];
Обратите внимание, что вы, вероятно, увидите более значительное повышение производительности, добавив индексы, которые сделают эти объединения оптимальными, чем повторная обработка запроса, при условии, что вы готовы снизить производительность для операций обновления.