SQL查询优化需求:获取t1中A1匹配t2但A2/A3不同的行的语句优化
优化SQL查询:找出t1与t2同A1但A2/A3不同的行
需求
我有两张表t1和t2,都包含A1、A2、A3三列。需要查询t1中满足以下条件的行:A1的值与t2中的A1匹配,但对应的A2或A3(或二者)与t2对应行的值不同。
原未优化查询语句
select t1.A1, t1.A2, t1.A3 from t1 where t1.A3 not In (select A3 from t2 where t2.A1 = t1.A1) or t1.A2 not In (select A2 from t2 where t2.A1 = t1.A1);
优化后的几种写法
方法1:用JOIN直接比对
通过JOIN关联两张表,直接对比A2和A3的值,避免原语句多次子查询的性能损耗:
SELECT t1.A1, t1.A2, t1.A3 FROM t1 JOIN t2 ON t1.A1 = t2.A1 WHERE t1.A2 != t2.A2 OR t1.A3 != t2.A3;
这种写法只需要一次关联操作,直接在WHERE子句中判断差异,数据量较大时性能提升明显,不会像原语句那样重复执行子查询。
方法2:用EXISTS避免重复行
如果t2中存在多个相同A1值的行,JOIN可能导致t1的行重复返回,此时用EXISTS可以确保t1每行只返回一次:
SELECT t1.A1, t1.A2, t1.A3 FROM t1 WHERE EXISTS ( SELECT 1 FROM t2 WHERE t2.A1 = t1.A1 AND (t1.A2 != t2.A2 OR t1.A3 != t2.A3) );
EXISTS子查询找到匹配行后会立即停止检索,相比原语句的两个NOT IN子查询,减少了不必要的全量数据比对,性能更优。
方法3:处理NULL值场景
如果A2或A3可能存在NULL值,直接用!=判断会失效(NULL与任何值比较结果为UNKNOWN),需要额外处理:
SELECT t1.A1, t1.A2, t1.A3 FROM t1 JOIN t2 ON t1.A1 = t2.A1 WHERE (t1.A2 != t2.A2 OR t1.A2 IS NULL != t2.A2 IS NULL) OR (t1.A3 != t2.A3 OR t1.A3 IS NULL != t2.A3 IS NULL);
通过对比两个列是否为NULL的布尔值,确保NULL值的差异也能被检测到。
内容的提问来源于stack exchange,提问作者V K
相关产品推荐
相关产品推荐

