SQL实现仅当code为1和2的两条记录均存在时返回查询结果的方法
正确实现方案
你要的逻辑是仅当code=1和code=2两条记录同时存在时,才返回这两条数据,否则返回空结果,可以用以下几种方式实现:
方案1:双exists直接判断(最简单,适合固定2个code的场景)
SELECT * FROM your_table a WHERE a.code IN (1, 2) -- 同时校验两个目标code都在表中存在 AND EXISTS (SELECT 1 FROM your_table WHERE code = 1) AND EXISTS (SELECT 1 FROM your_table WHERE code = 2);
逻辑清晰:先过滤出code为1、2的行,再额外加两个全局校验条件,只要任意一个code不存在,校验条件就不成立,整个查询就会返回空。
方案2:计数校验(扩展性更好,适合需要匹配多个code的场景)
如果后续需要匹配的code数量变多,可以用计数统一判断,不用逐个新增exists语句:
WITH target_codes AS ( -- 这里统一维护需要匹配的code列表,新增时直接加UNION ALL即可 SELECT 1 code UNION ALL SELECT 2 ), matched_result AS ( SELECT a.* FROM your_table a INNER JOIN target_codes t ON a.code = t.code ) SELECT * FROM matched_result -- 校验匹配到的唯一code数量和目标code数量完全一致 WHERE (SELECT COUNT(DISTINCT code) FROM matched_result) = (SELECT COUNT(*) FROM target_codes);
原写法问题说明
你现在的写法有两个核心问题:
- SQL条件优先级错误:
AND的优先级高于OR,你的原语句实际执行逻辑是WHERE a.code=2 OR (a.code=1 AND exists(...)),只要code=2存在就会返回结果,完全不符合需求 - 关联exists逻辑错误:子查询里用
a.code = b.code只能校验当前行的code存在,无法校验另一个目标code也存在,所以就算你加括号修正优先级,也达不到两个code都存在才返回的要求
内容的提问来源于stack exchange,提问作者Moudiz
相关产品推荐
相关产品推荐

