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