如何用SQL筛选出包含另一表所有指定别名的Id?
解决SQL查询:找出包含所有指定别名的Id
我明白你的问题了——简单的JOIN只会返回那些至少包含一个目标别名的Id,但你需要的是完全包含表N里所有别名的Id。下面给你两种实用的解决方案:
方法一:分组统计匹配数量
这种方法的核心思路是:先关联表A和表N,然后按Id分组,统计每个Id匹配到的不同别名数量,只有当这个数量等于表N里的唯一别名总数时,才说明该Id包含了所有目标别名。
SELECT A.Id FROM A JOIN N ON A.alias = N.name GROUP BY A.Id HAVING COUNT(DISTINCT A.alias) = (SELECT COUNT(DISTINCT name) FROM N);
解释:
JOIN N ON A.alias = N.name:先筛选出表A中属于表N的别名记录GROUP BY A.Id:按Id分组,聚合每个Id的匹配情况COUNT(DISTINCT A.alias):统计每个Id对应的不同别名数量(避免表A中同一别名重复出现导致计数不准)- 子查询
(SELECT COUNT(DISTINCT name) FROM N):获取表N里的唯一别名总数,作为判断标准
方法二:双重NOT EXISTS嵌套
这种方法用反向思维:找出那些不存在任何表N中的别名未被该Id包含的记录,也就是所有N的别名都能在该Id的A记录中找到。
SELECT DISTINCT A.Id FROM A WHERE NOT EXISTS ( -- 检查是否存在某个N中的别名,当前Id在A中没有对应记录 SELECT 1 FROM N WHERE NOT EXISTS ( SELECT 1 FROM A AS A2 WHERE A2.Id = A.Id AND A2.alias = N.name ) );
解释:
- 外层
SELECT DISTINCT A.Id:去重获取符合条件的Id - 内层第一个
NOT EXISTS:如果存在任何一个N的别名,在A中找不到对应Id的记录,那么这个Id就不符合要求 - 只有当所有N的别名都能在A中找到对应Id的记录时,外层的
NOT EXISTS才会成立,该Id才会被选中
这两种方法都能正确返回你想要的结果(2, 3),你可以根据自己的数据库环境和数据规模选择更合适的方案~
内容的提问来源于stack exchange,提问作者Skip Saillors
相关产品推荐
相关产品推荐

