Как выбрать строки в таблице (A), использующие один и тот же внешний ключ (itemId), где несколько строк в таблице имеют значения в таблице B - PullRequest
2 голосов
/ 20 декабря 2009

Извините за название, не знаю, как описать без примера. Я пытаюсь реализовать огранку атрибутов в SQL Server 2008.

У меня есть 2 таблицы. itemAttributes и facetParameters

Примите следующие значения в itemAttributes

id,   itemId,   name,      value
---------------------------------------
1     1         keywords   example1
2     1         keywords   example2
3     2         color      red
4     2         keywords   example1
5     2         keywords   example2
6     3         keywords   example2
7     3         color      red
8     3         color      blue

Допустим следующие значения в facetParameters

name      value
----------------------
keywords  example1
color     red

Мне нужно получить (необязательно: разные) itemIds, где у данного itemId есть строки, содержащие все значения в facetParameters.

например. учитывая строки в facetParameters, запрос должен возвращать itemId 2. В настоящий момент я буду использовать это в CTE, однако, учитывая, что они не поддерживают ряд функций, я могу обойти это, если в CTE нет решения, которое работает.

За эти годы я проделал немалую работу по sql, но этот действительно поставил меня в тупик, и позор в том, что я продолжаю думать, что ответ должен быть простым.

1 Ответ

7 голосов
/ 20 декабря 2009

Вы можете объединить обе таблицы и использовать предложение 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...