SQL查询:若人员曾有0.07百分比记录就过滤其所有数据如何实现
解决方案
你之前用的WHERE percent != 0.07只过滤了单条记录的取值,没有按人员维度做全局校验,所以会出现有过0.07记录的人员其他取值的记录仍然被返回的问题。正确的实现逻辑是先筛选出所有存在percent=0.07记录的人员,再在全量查询中排除这些人员,以下是几种常用实现方式:
写法1:NOT IN 子查询(逻辑最清晰易读)
SELECT * FROM 你的表名 WHERE 人员姓名字段 NOT IN ( SELECT DISTINCT 人员姓名字段 FROM 你的表名 WHERE percent = 0.07 );
子查询先提取所有有过0.07记录的人员名单,外层查询直接排除这些人员即可。
写法2:NOT EXISTS(性能表现更稳定)
SELECT * FROM 你的表名 t1 WHERE NOT EXISTS ( SELECT 1 FROM 你的表名 t2 WHERE t2.人员姓名字段 = t1.人员姓名字段 AND t2.percent = 0.07 );
逐行校验当前人员是否存在0.07的记录,不存在才返回,适合绝大多数业务场景。
写法3:LEFT JOIN 判空(适合大表优化场景)
SELECT t1.* FROM 你的表名 t1 LEFT JOIN ( SELECT DISTINCT 人员姓名字段 FROM 你的表名 WHERE percent = 0.07 ) t2 ON t1.人员姓名字段 = t2.人员姓名字段 WHERE t2.人员姓名字段 IS NULL;
关联后过滤掉匹配到有0.07记录的人员,部分数据库下该写法执行效率更高。
注意:如果你的人员姓名字段允许为NULL,建议优先使用NOT EXISTS或LEFT JOIN写法,避免NOT IN遇到NULL值时返回结果不符合预期。
内容的提问来源于stack exchange,提问作者Keanu Fuchs
相关产品推荐
相关产品推荐

