You need to enable JavaScript to run this app. UNION查询结果合并时如何优先保留来源1邮箱并剔除来源2重复记录
优惠活动
大模型
产品
解决方案
定价
更多

UNION查询结果合并时如何优先保留来源1邮箱并剔除来源2重复记录

实现源1邮箱优先、剔除源2重复匹配值的查询方案

核心处理逻辑

  • 打破原生UNION全局去重的限制,不做跨来源的无差别去重
  • 强制优先级规则:同PERSONID维度下,源1(SOURCE=1)存在的EMAILADDRESS,源2(SOURCE=2)中出现的相同值必须剔除
  • 源2独有的、在源1中不存在的邮箱值,全部正常保留

可直接复用的实现代码

写法1:LEFT JOIN反连接(全数据库兼容,性能稳定)

-- 取所有源1的有效记录
SELECT PERSONID, EMAILADDRESS, SOURCE
FROM target_table
WHERE SOURCE = 1

UNION ALL

-- 取源2中、未和源1形成同人员同邮箱重复的记录
SELECT s2.PERSONID, s2.EMAILADDRESS, s2.SOURCE
FROM target_table s2
LEFT JOIN target_table s1
  ON s2.PERSONID = s1.PERSONID
  AND s2.EMAILADDRESS = s1.EMAILADDRESS
  AND s1.SOURCE = 1
WHERE s2.SOURCE = 2
  -- 关联结果为空代表没有被源1的同值记录匹配,保留
  AND s1.PERSONID IS NULL

写法2:NOT EXISTS 子查询(语法更简洁)

SELECT PERSONID, EMAILADDRESS, SOURCE
FROM target_table t
WHERE
  -- 直接保留所有源1的记录
  SOURCE = 1
  OR (
    -- 源2的记录,只有当不存在同人员同邮箱的源1记录时才保留
    SOURCE = 2
    AND NOT EXISTS (
      SELECT 1
      FROM target_table t1
      WHERE t1.PERSONID = t.PERSONID
        AND t1.EMAILADDRESS = t.EMAILADDRESS
        AND t1.SOURCE = 1
    )
  )

样本数据校验

基于提供的3条原始数据执行查询:

  1. 保留PERSONID=7538583, EMAILADDRESS=email@example, SOURCE=1的记录
  2. 剔除PERSONID=7538583, EMAILADDRESS=email@example, SOURCE=2的重复记录
  3. 保留PERSONID=7538583, EMAILADDRESS=person@somecompany, SOURCE=2的独有记录
    最终输出2条结果,和预期完全匹配

注意事项

  • 关联匹配时必须带上PERSONID字段关联,不能仅通过邮箱值匹配,避免不同人员的同邮箱被误判为重复值
  • 两段查询拼接用UNION ALL即可,不要再叠加原生UNION的全局去重逻辑,避免误删源2本身存在的合规重复值

内容的提问来源于stack exchange,提问作者Brian Brock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 07:15:05