分组后 排除存在某种情况的 的查询

上午,公司运维问我一个查询问题,给他整的抓耳挠腮,虽然能实现,但是查询效率不敢恭维就来问我了。

场景模拟

社区进行了普调,统计了社区中各位业主的(A、B、C)工具情况,如下

业主名称 工具类型
张三 A
张三 B
张三 C
李四 B
李四 A
王五 B
赵六 A
孙七 B
周八 B
周八 A
吴九 A
吴九 C

社区领导要统计没有 C工具的业主名称

解决方式

自然会想到差集,先查询到有该工具的,然后再排除掉这些里面有其他工具的。这样会用到 not ! 此类运算符,自然效率差的爆。那怎么解决呢?转念想一下,就想到了 case搜索函数

预设表名: table
业主名称:owner
工具:tool


SELECT * FROM (
 SELECT `owner`, MAX( CASE WHEN tool ='C' THEN 1 ELSE 0 END ) AS `only_tool` FROM table GROUP BY `owner`
 ) t WHERE  t.`only_tool` = 1

后续这个 MAX 可以看情况处理,比如没有两样的 就可以 继续使用CASE搜索函数并用 IN 或者 EXISTS来解决。

上一篇:Java成长之路--一个非科班生的进阶之路


下一篇:SQL 优化 第七章 查询转换 2视图合并和谓词推入