SQL Query列出从REF表中购买完全相同的三个项目的所有朋友

时间:2014-08-22 20:51:33

标签: sql sql-server sql-server-2008

我想列出所有购买了ItemID 1,2,3

的朋友
CREATE TABLE #FRIENDS
(
    PERSONID int,
    ITEMID int
)

insert into #FRIENDS VALUES (1, 1)  
insert into #FRIENDS VALUES (1, 2)  
insert into #FRIENDS VALUES (1, 3)  
insert into #FRIENDS VALUES (1, 6)  
insert into #FRIENDS VALUES (2, 1)  
insert into #FRIENDS VALUES (3, 1)  
insert into #FRIENDS VALUES (2, 8)  
insert into #FRIENDS VALUES (5, 1)  
insert into #FRIENDS VALUES (4, 1)  
insert into #FRIENDS VALUES (7, 1)  
insert into #FRIENDS VALUES (8, 1)  
insert into #FRIENDS VALUES (8, 2)  
insert into #FRIENDS VALUES (8, 3)  
insert into #FRIENDS VALUES (9, 3)  
insert into #FRIENDS VALUES (9, 2)  
insert into #FRIENDS VALUES (9, 1)  

样品O / P
个人

1  
8  
9

我想获得购买所有三件商品的清单,而不是任何一件商品。

2 个答案:

答案 0 :(得分:3)

这是“set-within-sets”查询的示例。我喜欢使用group byhaving来解决此问题,因为此方法在匹配集合的规则方面非常灵活。

select personid
from #friends f
group by personid
having count(distinct item) = 3 and
       count(distinct (case when item in (1, 2, 3) then item end)) = 3;

也就是说,每个人都买了三件物品。并且,每个人在您关心的集合中购买了三件物品。瞧!正是这三个项目,不多也不少。

编辑:

文字说“谁带来了确切的第1,2,3项”,这就是上面所做的。你似乎想要一个人1,所以你想要买1,2,3和其他东西的人。轻松完成:

select personid
from #friends f
where item in (1, 2, 3)
group by personid
having count(distinct item) = 3;

答案 1 :(得分:0)

您可以使用INTERSECT集合运算符:

小提琴: http://sqlfiddle.com/#!3/a9a80/2/0

select personid
  from friends
 where itemid = 1
intersect
select personid
  from friends
 where itemid = 2
intersect
select personid
  from friends
 where itemid = 3