Вы можете объединить обе таблицы и использовать предложение having
, чтобы убедиться, что все элементы совпадают:
select ia.itemid
from @itemAttributes ia
inner join @facetParameters fp
on ia.name = fp.name
and ia.value = fp.value
group by ia.itemid
having count(distinct fp.name) =
(
select count(*) from @facetParameters
)
Количество в предложении having
предполагает, что имя однозначно идентифицирует строку в таблице facetParameters. Если этого не произойдет, добавьте столбец идентификации в facetParameters и используйте count(distinct id_column)
вместо count(distinct fp.name)
.
Вот код для создания набора данных в вопросе:
declare @itemAttributes table (id int, itemId int,
name varchar(max), value varchar(max))
insert into @itemAttributes
select 1,1,'keywords','example1'
union all select 2,1,'keywords','example2'
union all select 3,2,'color','red'
union all select 4,2,'keywords','example1'
union all select 5,2,'keywords','example2'
union all select 6,3,'keywords','example2'
union all select 7,3,'color','red'
union all select 8,3,'color','blue'
declare @facetParameters table (name varchar(max), value varchar(max))
insert into @facetParameters
select 'keywords','example1'
union all select 'color','red'