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条原始数据执行查询:
- 保留
PERSONID=7538583, EMAILADDRESS=email@example, SOURCE=1的记录- 剔除
PERSONID=7538583, EMAILADDRESS=email@example, SOURCE=2的重复记录- 保留
PERSONID=7538583, EMAILADDRESS=person@somecompany, SOURCE=2的独有记录
最终输出2条结果,和预期完全匹配
注意事项
- 关联匹配时必须带上
PERSONID字段关联,不能仅通过邮箱值匹配,避免不同人员的同邮箱被误判为重复值 - 两段查询拼接用
UNION ALL即可,不要再叠加原生UNION的全局去重逻辑,避免误删源2本身存在的合规重复值
内容的提问来源于stack exchange,提问作者Brian Brock
相关产品推荐
相关产品推荐

