鉴于以下数据结构,我将通过示例解释该问题,以便于理解:
id userId
1 1
1 2
2 2
3 2
1 3
2 3
我可以获取一组用户的 id
列表,如下所示:
declare @tmp table (id int, userId int)
insert into @tmp values(1,1), (1,2), (2,2), (3,2), (1,3), (2,3)
select id from @tmp
where userId in (1,2,3)
group by id
这将按预期返回以下内容:
id
1
2
3
我的问题是,如何才能只获取在 where
子句中映射 EVERY userId 的 id?例如(1,2,3) 中的 userId
的结果应为 1
,(2,3) 中的 userId
的结果应为 1,2
我尝试过检查每个 id,然后合并它们,但到目前为止还没有找到实际的解决方案。
注意该解决方案必须适用于更大的数据集,想象一下数百万行和数千个用户ID,解决方案的效率并不那么重要(因为它不必经常运行)
第二个注意我刚刚注意到,对结果进行计数实际上并不能保证正确性,因为两个不同的 userId 可能具有相同的映射计数,但映射到不同的 Item。在这种情况下,它不再是一个交叉路口
最佳答案
您可以使用用户 ID 的计数来检查...就像这样
SELECT Id
From table
Where userid in (1,2,3)
Group by id
Having count(userid) = (select count(distinct userid) from table where userid in(1,2,3))
理想情况下,这两个条件会被参数化,但这超出了这个问题的范围。
关于SQL 选择其中的交集而不是并集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48909878/