SQL 选择其中的交集而不是并集

标签 sql sql-server database

鉴于以下数据结构,我将通过示例解释该问题,以便于理解:

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/

相关文章:

sql - 如何更新表中的所有行并增加一列?

sql - 在 sql server 中将 12 小时格式转换为 24 小时格式

C# 使用 OLEDB 连接调用存储过程不起作用

sql-server - 使用 MS SQL Server 的 ODBC 数据源管理器

sql - 我如何设计这个链接表?

c# - 3 层系统中数据库层的正确抽象?

mysql - 多重订购 是否可以按日期订购的模块 id 带来最新(仅一篇)文章?例子

mysql - 从聚合函数定义的列中选择值

mysql - 为什么我在 View SELECT 查询中收到带有 WHERE 子句的 "Unknown column ' xyz'"?

swift - Xcode Swift在项目中使用.db数据库