对不起标题,不确定没有示例如何描述。我试图在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

我需要检索(可选:不同的)itemId,其中给定的itemId具有包含facetParameters中所有值的行。

例如给定facetParameters中的行,查询应返回itemId2。目前,我将在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中添加一个identity列,并使用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'

10-02 22:54