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

如何在不覆盖旧数据的情况下向SQL表追加并更新新数据?

合并历史推广数据与更新/新增数据的SQL方案

要实现保留历史推广活动(Alfa、Beta)的原始数据,同时用临时表中的更新数据替换Gamma,并新增Delta的需求,最直观且兼容性强的方案是使用UNION ALL结合条件筛选:

核心SQL语句

假设原表名为campaigns,临时表名为temp_campaigns,以Campaign ID作为唯一标识:

-- 保留原表中未被临时表覆盖的历史记录
SELECT 
    `Campaign ID`, 
    `Campaign Name`, 
    Impressions, 
    Clicks, 
    Purchases
FROM campaigns
WHERE `Campaign ID` NOT IN (SELECT `Campaign ID` FROM temp_campaigns)

UNION ALL

-- 加入临时表中的更新记录和新增记录
SELECT 
    `Campaign ID`, 
    `Campaign Name`, 
    Impressions, 
    Clicks, 
    Purchases
FROM temp_campaigns;

逻辑解释

  1. 第一部分查询:通过NOT IN筛选出原表中不存在于临时表的推广活动(也就是Alfa和Beta),直接保留它们的原始数据。
  2. 第二部分查询:直接读取临时表的全部数据,包含更新后的Gamma和新增的Delta。
  3. UNION ALL:将两部分结果合并,不会去重(因为两部分的Campaign ID没有重叠),最终得到你需要的完整数据集。

替代方案(适用支持FULL JOIN的数据库)

如果你的数据库支持FULL OUTER JOIN(比如PostgreSQL、SQL Server),也可以用COALESCE函数优先取临时表的数据:

SELECT
    COALESCE(t.`Campaign ID`, c.`Campaign ID`) AS `Campaign ID`,
    COALESCE(t.`Campaign Name`, c.`Campaign Name`) AS `Campaign Name`,
    COALESCE(t.Impressions, c.Impressions) AS Impressions,
    COALESCE(t.Clicks, c.Clicks) AS Clicks,
    COALESCE(t.Purchases, c.Purchases) AS Purchases
FROM campaigns c
FULL OUTER JOIN temp_campaigns t 
    ON c.`Campaign ID` = t.`Campaign ID`;

COALESCE函数会依次返回第一个非空值,所以当临时表有对应记录时,会优先使用临时表的更新数据;没有对应记录时,就用原表的历史数据,同时自动包含临时表中的新增记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:15:34