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

Sql 如何选择表(A)中共享相同外键(itemId)的行,其中表中的多行具有表B中的值,sql,tsql,Sql,Tsql,标题很抱歉,不知道如何描述,没有例子。我正在尝试在SQLServer2008中实现属性的方面化 我有两张桌子。itemAttributes和facetParameters name value ---------------------- keywords example1 color red 假设itemAttributes中有以下值 id, itemId, name, value ------------------------------------

标题很抱歉,不知道如何描述,没有例子。我正在尝试在SQLServer2008中实现属性的方面化

我有两张桌子。itemAttributes和facetParameters

name      value
----------------------
keywords  example1
color     red
假设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
我需要检索(可选:不同的)itemId,其中给定的itemId具有包含facetParameters中所有值的行

e、 g.给定facetParameters中的行,查询应返回itemId 2。目前,我将在CTE中使用它,但鉴于它们不支持许多功能,如果CTE中没有可行的解决方案,我可以解决这个问题


这些年来,我做了很多sql,但这一个确实让我感到困惑,遗憾的是我一直认为答案必须很简单。

您可以将两个表合并,并使用
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\u列)
而不是
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'

完美,从未考虑过使用“拥有”。我现在所要做的就是让数百万行的性能达到亚秒级:)