SQL查询需求:筛选符合条件的Slot表数据(含LEFT JOIN)
筛选符合条件的Slot记录
原查询的问题
你的查询存在逻辑漏洞:当某个slot在SlotAlteration中同时有action=0和action=1的记录时,LEFT JOIN会返回两条结果,其中action=0的那条会被WHERE条件保留,导致这个本应被排除的slot错误出现在结果里。
正确解决方案
方案1:用NOT EXISTS子查询(推荐)
直接检查当前slot是否不存在action=1的关联记录,逻辑清晰且性能较好:
SELECT s.* FROM Slot s WHERE s.time_off_id IS NULL AND NOT EXISTS ( SELECT 1 FROM SlotAlteration sa WHERE sa.slot_id = s.id AND sa.action = 1 );
方案2:LEFT JOIN筛选无action=1的记录
通过LEFT JOIN仅关联action=1的记录,再判断关联结果为空,确保没有匹配的action=1条目:
SELECT s.* FROM Slot s LEFT JOIN SlotAlteration sa ON s.id = sa.slot_id AND sa.action = 1 WHERE s.time_off_id IS NULL AND sa.id IS NULL;
方案3:GROUP BY + HAVING(适合需统计场景)
如果需要同时查看slot的action统计情况,可分组后确保最大action值不是1:
SELECT s.* FROM Slot s LEFT JOIN SlotAlteration sa ON s.id = sa.slot_id WHERE s.time_off_id IS NULL GROUP BY s.id, s.time_off_id -- 需包含Slot表所有非聚合字段 HAVING MAX(sa.action) IS NULL OR MAX(sa.action) != 1;
以上三种方法都能准确筛选出time_off_id为null,且对应slot_id在SlotAlteration中不存在action=1记录的Slot数据。
内容的提问来源于stack exchange,提问作者RomanMin
相关产品推荐
相关产品推荐

