SQL一对多桥表查询:获取所有成员国家均为US的唯一分组
需求
编写SQL查询逻辑,从TableGroup表返回满足条件的分组:关联一对多桥表TableMember时,目标分组下所有成员的country字段值均等于'US';若分组下存在任意成员所属国家为非US国家,则该分组不纳入结果集。基于提供的测试样例数据,查询最终应当仅返回Group1。
测试表结构与样例数据
-- 成员桥表 CREATE TABLE TableMember ( GroupId INT, member varchar(50), country VARCHAR(5) ); -- 插入成员测试数据 INSERT INTO TableMember VALUES (123, 'member1', 'US'), (123, 'member2', 'US'), (123, 'member3', 'US'), (124, 'member4', 'UK'), (124, 'member5', 'US'), (124, 'member6', 'US'), (125, 'member1', 'IE'), (125, 'member2', 'IE'), (125, 'member3', 'IE'), (126, 'member4', 'UK'), (126, 'member5', 'US'), (126, 'member6', 'US'); -- 分组主表 CREATE TABLE TableGroup ( GroupId INT, GroupName VARCHAR(20) ); -- 插入分组测试数据 INSERT INTO TableGroup VALUES (123,'Group1'), (124,'Group2'), (125,'Group3'), (126,'Group4');
实现方案
提供两种通用可落地的写法,均能返回预期结果:
- 写法1:
NOT EXISTS写法,语义直观、查询性能通常较好,核心逻辑为筛选不存在任何非US成员的分组
SELECT g.GroupName FROM TableGroup g WHERE NOT EXISTS ( SELECT 1 FROM TableMember m WHERE m.GroupId = g.GroupId AND m.country <> 'US' );
- 写法2:
GROUP BY + HAVING聚合判断写法,核心逻辑为按分组聚合后,统计组内非US成员的数量,数量为0即符合全US要求
SELECT g.GroupName FROM TableGroup g INNER JOIN TableMember m ON g.GroupId = m.GroupId GROUP BY g.GroupId, g.GroupName HAVING SUM(CASE WHEN m.country <> 'US' THEN 1 ELSE 0 END) = 0;
结果说明
以上两种SQL执行后,均仅返回Group1,符合预期:
- Group2、Group4存在所属国家为UK的成员,被排除
- Group3所有成员所属国家为IE,被排除
内容的提问来源于stack exchange,提问作者POSH Guy
相关产品推荐
相关产品推荐

