基于分组成员关系的SQL查询:关联表t、o筛选符合条件行的优雅实现
实现方案
最简洁易读的实现方式是通过子查询先找出所有符合关联条件的grouping值,再用IN匹配所有对应行:
SELECT * FROM t WHERE grouping IN ( SELECT DISTINCT t.grouping FROM t INNER JOIN o ON t.feature = o.feature );
逻辑说明:子查询部分先关联t和o表,拿到所有t.feature和o.feature匹配的行对应的grouping值,加DISTINCT是为了避免返回重复的分组值提升查询效率;外层查询直接过滤t表中grouping落在这个集合里的所有行,完全匹配需求,查询结果如下:
| feature | grouping |
|---|---|
| A | 1 |
| B | 2 |
| E | 1 |
| F | 2 |
| G | 1 |
如果你的数据库支持CTE(公共表表达式),也可以写成下面这种形式,逻辑拆分更清晰,适合后续复杂逻辑扩展:
WITH matched_group AS ( SELECT DISTINCT t.grouping FROM t INNER JOIN o ON t.feature = o.feature ) SELECT * FROM t WHERE grouping IN (SELECT grouping FROM matched_group);
以上两种都是标准SQL语法,兼容几乎所有主流关系型数据库,可读性和执行效率都很高。
内容的提问来源于stack exchange,提问作者ayasugihada
相关产品推荐
相关产品推荐

