如何在MySQL查询中排除特定行?附表结构与需求
嘿,这个需求其实是要把那些「所在Unique_1分组里有Value=ALL记录」的行全部排除掉对吧?我给你两种常用的SQL实现方式,都能精准达到你要的效果:
你的表结构
Table1
ID Part1 key Unique_1 ARF-11 Aekjh aer-ert IYT-15 ARF-12 Aferf aee-sta IYT-15 ARF-13 Berfe aer-ert IYT-15 ARF-14 Aeret aty-ert IYT-16 ARF-15 xrete ant-ert IYT-16 ARF-16 srete ant-ert IYT-17
Table2
Key Value aer-ert Some aee-sta ALL aty-ert Few ant-ert Less
需求核心
咱们要保留的是:整个Unique_1分组里完全没有Value=ALL记录的所有行。简单说就是,只要某个Unique_1分组里出现过一次Value=ALL,那这个分组的所有行都要被移除(比如示例里的IYT-15分组就因为包含aee-sta对应的ALL,所以全组被排除)。
解决方案
方法一:用NOT EXISTS关联子查询(逻辑最直观)
这种写法直接检查当前行所属的Unique_1分组里有没有Value=ALL的记录,没有就保留:
SELECT t1.ID, t1.Part1, t1.key, t1.Unique_1, t2.Value FROM Table1 t1 INNER JOIN Table2 t2 ON t1.key = t2.Key WHERE NOT EXISTS ( -- 子查询:检查当前Unique_1分组是否存在Value=ALL的记录 SELECT 1 FROM Table1 t1_inner INNER JOIN Table2 t2_inner ON t1_inner.key = t2_inner.Key WHERE t1_inner.Unique_1 = t1.Unique_1 AND t2_inner.Value = 'ALL' );
方法二:用CTE先筛选合法的Unique_1分组
先把所有不含Value=ALL的Unique_1分组找出来,再关联原表获取完整数据:
WITH ValidUniqueGroups AS ( SELECT t1.Unique_1 FROM Table1 t1 INNER JOIN Table2 t2 ON t1.key = t2.Key GROUP BY t1.Unique_1 -- 统计分组里Value=ALL的数量,等于0说明该分组完全没有ALL记录 HAVING COUNT(CASE WHEN t2.Value = 'ALL' THEN 1 END) = 0 ) SELECT t1.ID, t1.Part1, t1.key, t1.Unique_1, t2.Value FROM Table1 t1 INNER JOIN Table2 t2 ON t1.key = t2.Key INNER JOIN ValidUniqueGroups vu ON t1.Unique_1 = vu.Unique_1;
最终执行结果
两种方法都会输出你期望的结果:
ID Part1 key Unique_1 Value ARF-14 Aeret aty-ert IYT-16 Few ARF-15 xrete ant-ert IYT-16 Less ARF-16 srete ant-ert IYT-17 Less
内容的提问来源于stack exchange,提问作者Roy1245
相关产品推荐
相关产品推荐

