如何选择表(A)中共享相同外键(itemId)的行,其中表中的多行具有表B中的值

Ada*_*den 2 sql t-sql

抱歉标题,不知道如何描述没有例子.我试图在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
Run Code Online (Sandbox Code Playgroud)

在facetParameters中假设以下值

name      value
----------------------
keywords  example1
color     red
Run Code Online (Sandbox Code Playgroud)

我需要检索(可选:distinct)itemIds,其中给定的itemId包含包含facetParameters中所有值的行.

例如,给定facetParameters中的行,查询应返回itemId 2.此时我将在CTE中使用它,但是假设它们不支持许多功能,我可以解决这个问题,如果没有解决方案可以在CTE中工作.

多年来我做了很多sql,但是这一次真的让我很难过,而且我一直认为答案一定很简单.

And*_*mar 7

您可以连接两个表,并使用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
           )
Run Code Online (Sandbox Code Playgroud)

having子句中的count 假定该名称唯一标识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'
Run Code Online (Sandbox Code Playgroud)