我想列出所有购买了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
我想获得购买所有三件商品的清单,而不是任何一件商品。
答案 0 :(得分:3)
这是“set-within-sets”查询的示例。我喜欢使用group by
和having
来解决此问题,因为此方法在匹配集合的规则方面非常灵活。
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