MySQL Workbench中UNION去重失效 输出与UNION ALL一致问题
UNION与UNION ALL查询结果一致的原因
核心逻辑说明
出现这个现象不是UNION的去重功能失效,是对UNION去重规则的理解有偏差:
- UNION默认是
UNION DISTINCT,去重判断针对结果集的整行所有列,只有两行的每一列值都被判定为相等时,才会被当作重复行剔除,不会单独按某几个字段、主键去重。 - 注意:虽然在WHERE条件的相等判断中
NULL = NULL返回结果为未知(不成立),但在UNION去重、DISTINCT去重的场景中,两个NULL会被判定为相等值。
对应你的SQL分析
你执行的SQL如下:
SELECT e.emp_no, e.first_name, e.last_name, NULL AS dept_no, NULL AS from_date FROM employees_dup AS e WHERE e.emp_no = 10001 UNION SELECT NULL AS emp_no, NULL AS first_name, NULL AS last_name, m.dept_no, m.from_date FROM dept_manager AS m;
这个查询的两个分支返回的行,根本不存在满足整行相等条件的重复行:
- 第一个分支返回的行:前3列是10001号员工的非空真实数据,后2列是填充的NULL,行格式类似
(10001, 'Georgi', 'Facello', NULL, NULL) - 第二个分支返回的行:前3列是填充的NULL,后2列是dept_manager表存储的非空真实数据,行格式类似
(NULL, NULL, NULL, 'd005', '1992-04-25')
两类行的非空值完全错开,没有任何两行能做到所有列的值完全匹配,因此UNION不会剔除任何行,最终返回结果和直接返回全量合并数据的UNION ALL完全一致。
自测验证方法
如果要验证UNION的去重效果,可以人为构造一行完全重复的测试数据:比如在第一个SELECT分支后追加一段常量查询,让它返回一行和第二个分支某条记录完全一致的值,再执行UNION就能看到重复行被自动剔除。
内容的提问来源于stack exchange,提问作者DAking
相关产品推荐
相关产品推荐

