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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:45:05