SQL两表UNION合并主键重复仅保留单行的方案咨询
可行实现方案
有两种常用的实现方式,都不需要修改Unique_key的原有格式:
方案1:使用窗口函数(兼容性更好)
给两个表的查询结果新增优先级标记,table1的优先级高于table2,再按Unique_key分组后取优先级最高的1条数据即可,主流SQL数据库(MySQL 8.0+/PostgreSQL/SQL Server等)都支持该写法:
SELECT EmailAddress,CUSTOMER_ID,Send_Date,Unique_key,sub_category FROM ( SELECT EmailAddress,CUSTOMER_ID,Send_Date,Unique_key,sub_category, ROW_NUMBER() OVER(PARTITION BY Unique_key ORDER BY source_priority ASC) AS rn FROM ( SELECT DISTINCT EmailAddress,CUSTOMER_ID,Send_Date,Unique_key,sub_category, 1 AS source_priority FROM table1 UNION ALL SELECT DISTINCT EmailAddress,CUSTOMER_ID,Send_Date,Unique_key,sub_category, 2 AS source_priority FROM table2 ) union_data ) filter_data WHERE rn = 1;
方案2:使用NOT EXISTS过滤(性能更优)
直接取table1的全量数据,再拼接table2中不存在于table1的Unique_key对应的数据,不需要做窗口排序,数据量较大时效率更高:
-- 取table1的所有符合要求的记录 SELECT DISTINCT EmailAddress,CUSTOMER_ID,Send_Date,Unique_key,sub_category FROM table1 UNION ALL -- 仅保留table2中Unique_key未在table1出现过的记录 SELECT DISTINCT t2.EmailAddress,t2.CUSTOMER_ID,t2.Send_Date,t2.Unique_key,t2.sub_category FROM table2 t2 WHERE NOT EXISTS ( SELECT 1 FROM table1 t1 WHERE t1.Unique_key = t2.Unique_key );
以上两种方案运行后,都可以得到你预期的输出结果,重复Unique_key只会保留table1对应的行。
内容的提问来源于stack exchange,提问作者rtys
相关产品推荐
相关产品推荐

