优化多表关联SQL查询:合并重复条件并兼容key_1/key_2筛选
优化重复条件的SQL改写方案
针对你遇到的WHERE子句重复检查isSomeCheck和isOtherCheck的问题,这里提供几种简洁的优化方案,核心思路是将重复的过滤逻辑集中定义,避免多次书写:
方案一:使用CTE预过滤TABLE_B
先通过公共表表达式(CTE)筛选出TABLE_B中符合isSomeCheck=1或isOtherCheck=1的记录,后续查询直接复用这个结果集,彻底消除重复逻辑:
WITH filtered_B AS ( SELECT key_1, key_2 FROM TABLE_B WHERE isSomeCheck = 1 OR isOtherCheck = 1 ) SELECT a.some_id FROM TABLE_A a JOIN TABLE_C c ON a.some_id = c.some_id WHERE -- 存在匹配的key_1 EXISTS (SELECT 1 FROM filtered_B b WHERE b.key_1 = c.key_1) -- 不存在匹配的key_1,但存在匹配的key_2 OR (NOT EXISTS (SELECT 1 FROM filtered_B b WHERE b.key_1 = c.key_1) AND EXISTS (SELECT 1 FROM filtered_B b WHERE b.key_2 = c.key_2))
方案二:用LEFT JOIN简化存在性判断
通过两次LEFT JOIN关联预过滤后的TABLE_B,直接通过连接结果的非空状态判断条件,代码可读性更强:
WITH filtered_B AS ( SELECT key_1, key_2 FROM TABLE_B WHERE isSomeCheck = 1 OR isOtherCheck = 1 ) SELECT DISTINCT a.some_id FROM TABLE_A a JOIN TABLE_C c ON a.some_id = c.some_id -- 关联key_1匹配的记录 LEFT JOIN filtered_B b1 ON b1.key_1 = c.key_1 -- 关联key_2匹配的记录 LEFT JOIN filtered_B b2 ON b2.key_2 = c.key_2 WHERE b1.key_1 IS NOT NULL OR (b1.key_1 IS NULL AND b2.key_2 IS NOT NULL)
注:添加DISTINCT是避免因多匹配导致的重复some_id,如果你的数据不会出现这种情况可以省略。
方案三:整合EXISTS子查询逻辑
把两种判断条件合并到一个EXISTS子查询中,同样只写一次过滤逻辑:
SELECT a.some_id FROM TABLE_A a JOIN TABLE_C c ON a.some_id = c.some_id WHERE EXISTS ( SELECT 1 FROM TABLE_B b WHERE (b.isSomeCheck = 1 OR b.isOtherCheck = 1) AND ( -- 匹配key_1的情况 b.key_1 = c.key_1 -- 无匹配key_1但匹配key_2的情况 OR (b.key_2 = c.key_2 AND NOT EXISTS ( SELECT 1 FROM TABLE_B b2 WHERE b2.key_1 = c.key_1 AND (b2.isSomeCheck = 1 OR b2.isOtherCheck = 1) )) ) )
这三种方案都能实现你的业务需求,同时消除了重复的条件判断,其中方案一和方案二的代码结构更清晰,维护成本更低,推荐优先使用。
内容的提问来源于stack exchange,提问作者Rumin
相关产品推荐
相关产品推荐

