如何在不覆盖旧数据的情况下向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;
逻辑解释
- 第一部分查询:通过
NOT IN筛选出原表中不存在于临时表的推广活动(也就是Alfa和Beta),直接保留它们的原始数据。 - 第二部分查询:直接读取临时表的全部数据,包含更新后的Gamma和新增的Delta。
- 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
相关产品推荐
相关产品推荐

