如何获取两个T-SQL查询结果的交集?
如何获取两个SQL查询结果的交集
当然可以拿到这两个查询结果的交集,这里有几种常用的实现方案,你可以按需选择:
1. 用INTERSECT关键字(最推荐)
这是SQL里专门用来取两个结果集交集的标准语法,不仅写法简洁,还会自动帮你去重,大部分主流数据库(比如SQL Server、PostgreSQL、MySQL 8.0+等)都支持:
SELECT title FROM operations INTERSECT SELECT o.title FROM role_operation ro INNER JOIN roles r ON ro.role_id = r.id INNER JOIN operations o ON ro.operation_id = o.id WHERE r.title = N'role1';
执行这个语句后,会直接返回同时出现在两个查询里的title——也就是operation1、operation3、operation4,和你预期的交集结果一致。
2. 用IN子查询实现
如果你的数据库版本比较旧,对INTERSECT支持不好,或者更习惯子查询的写法,也可以这么做:
SELECT title FROM operations WHERE title IN ( SELECT o.title FROM role_operation ro INNER JOIN roles r ON ro.role_id = r.id INNER JOIN operations o ON ro.operation_id = o.id WHERE r.title = N'role1' );
逻辑很简单:先执行括号里的子查询得到第二个结果集,再从第一个查询的结果里筛选出存在于这个子集中的title值。
3. 用INNER JOIN连接临时结果集
把两个查询的结果分别当作临时表,通过title字段做内连接,也能得到交集:
SELECT DISTINCT op.title FROM (SELECT title FROM operations) op INNER JOIN ( SELECT o.title FROM role_operation ro INNER JOIN roles r ON ro.role_id = r.id INNER JOIN operations o ON ro.operation_id = o.id WHERE r.title = N'role1' ) rop ON op.title = rop.title;
这里加DISTINCT是为了防止出现重复行(如果原查询结果本身有重复数据的话),如果你的两个原始查询结果都是唯一的,可以去掉这个关键字。
内容的提问来源于stack exchange,提问作者developer
相关产品推荐
相关产品推荐

