Это неплохой подход, в зависимости от размеров и индексов таблиц, включая @nameValuePairs. Если число этих строк велико или оно становится медленным, лучше вместо этого поместить @namValuePairs во временную таблицу, добавить соответствующие индексы и использовать один запрос вместо двух отдельных.
Я заметил, что вы помещаете столбцы в #temp, который вы не используете, будет быстрее исключить их (хотя это будет означать дублирование строк в #temp). Кроме того, во втором запросе столбцы «различаются» и «группируются по» в одних и тех же столбцах. Вам не нужно и то и другое, поэтому я бы отбросил «отчетливый» (вероятно, это не повлияет на производительность, потому что оптимизатор уже понял это).
Наконец, #temp, вероятно, будет быстрее с кластеризованным неуникальным индексом на expressionid (я предполагаю, что это SQL 2005). Вы можете добавить его после SELECT..INTO, но обычно это так же быстро или быстро добавить его перед загрузкой. Это потребует от вас сначала СОЗДАТЬ #temp, добавить кластеризованный, а затем использовать INSERT..SELECT, чтобы загрузить его.
Я добавлю пример объединения запросов за несколько минут ... Хорошо, вот один из способов объединить их в один запрос (это также должно быть совместимо с 2000):
-- retrieve number of name-value pairs
SET @noOfAttributes = select count(*) from @nameValuePairs
-- now select the IDs I need
-- since I did a select distinct above if the number of matches
-- for a given ID is the same as noOfAttributes then BINGO!
select
expressionId
from
(
select distinct
e.expressionId, a.attributeName, a.attributeValue
from
expressions e
join
attributes a
on
e.attributeId = a.attributeId
join --> this join does the filtering
@nameValuePairs nvp
on
a.attributeName = nvp.name and a.attributeValue = nvp.value
) as Temp
group by expressionId
having count(*) = @noOfAttributes