You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:48:32