抱歉标题,不知道如何描述没有例子.我试图在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,但是这一次真的让我很难过,而且我一直认为答案一定很简单.
您可以连接两个表,并使用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)
| 归档时间: |
|
| 查看次数: |
2748 次 |
| 最近记录: |