SQL多条件场景下Union与Inner join写法对比:两条语句结果是否一致
两条SQL执行结果对比结论
绝大多数场景下两条SQL的执行结果不相同,仅在极少数特殊约束下结果一致,核心差异如下:
- 去重逻辑不同
SQL1使用UNION合并三次INNER JOIN的结果,UNION会默认对合并后的全量结果集做整行去重,只要两行的所有字段值完全一致,就只会保留一条。
SQL2的INNER JOIN采用OR拼接关联条件,只会按照关联规则匹配A、B表的行,不会自动对结果去重:只要A表某行和B表某行满足任意一个关联条件,就会生成一行结果,完全相同的行也会全部保留。
举个简单示例:A表有2条完全相同的行a,B表有1条行b,condition1和condition2都支持a和b匹配。SQL1三次JOIN后会得到多组(a,b),UNION去重后最终只返回1条(a,b);SQL2直接关联会返回2条(a,b),二者结果明显不同。 - 结果一致的特殊前提
只有同时满足以下所有条件时,两条SQL的返回结果才会一致:- A、B表都不存在完全重复的行
- 任意一对(A行,B行)最多只能满足三个关联条件中的一个
- 三次JOIN的结果没有完全重复的行
补充说明:如果希望SQL2实现和SQL1完全一致的效果,需要在SQL2的查询开头加上
DISTINCT,即SELECT DISTINCT 字段列表 FROM A INNER JOIN B ON (condition1) OR (condition2) OR (condition3)。
内容的提问来源于stack exchange,提问作者wait
相关产品推荐
相关产品推荐

