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

如何找出新旧两张数据表的增删改数据差异?附SQL代码片段

对比两张数据表的差异:新增、删除、修改数据定位方案

嘿,我看你正在折腾新旧两个商品数据表的差异对比——旧表ITEMS有16000行,新表ITEMS_032818多了2000行左右,想精准找出新增、删除和修改的数据对吧?我来帮你把那段没写完的SQL补全,再给你一套完整的差异定位方案。

1. 定位新表中新增的数据

新增数据指的是只在新表ITEMS_032818里存在、旧表ITEMS没有的记录(这里默认UPC是唯一标识字段)。你的那段SQL可以补全成这样:

SELECT UPC, Name 
FROM ITEMS_032818 AS ND 
WHERE NOT EXISTS (
    SELECT 1  -- 这里不用选UPC/Name,选1查询效率更高
    FROM ITEMS AS OD 
    WHERE ND.UPC = OD.UPC
);

如果你习惯用LEFT JOIN写法,这个版本有时候性能更优:

SELECT ND.UPC, ND.Name
FROM ITEMS_032818 AS ND
LEFT JOIN ITEMS AS OD ON ND.UPC = OD.UPC
WHERE OD.UPC IS NULL;

2. 定位旧表中删除的数据(新表中已移除的旧记录)

这部分是找旧表有、但新表已经没有的行,写法和新增查询刚好反过来:

SELECT UPC, Name 
FROM ITEMS AS OD 
WHERE NOT EXISTS (
    SELECT 1
    FROM ITEMS_032818 AS ND 
    WHERE OD.UPC = ND.UPC
);

同样可以用LEFT JOIN实现:

SELECT OD.UPC, OD.Name
FROM ITEMS AS OD
LEFT JOIN ITEMS_032818 AS ND ON OD.UPC = ND.UPC
WHERE ND.UPC IS NULL;

3. 定位修改的数据(UPC存在于两张表,但字段内容有变化)

如果是对比Name字段的修改,SQL可以这么写:

SELECT 
    OD.UPC,
    OD.Name AS Old_Name,
    ND.Name AS New_Name
FROM ITEMS AS OD
JOIN ITEMS_032818 AS ND ON OD.UPC = ND.UPC
WHERE OD.Name <> ND.Name;

注意:如果Name字段可能存在NULL值,要额外处理NULL的对比情况,避免遗漏:

SELECT 
    OD.UPC,
    OD.Name AS Old_Name,
    ND.Name AS New_Name
FROM ITEMS AS OD
JOIN ITEMS_032818 AS ND ON OD.UPC = ND.UPC
WHERE (OD.Name <> ND.Name) 
   OR (OD.Name IS NULL AND ND.Name IS NOT NULL) 
   OR (OD.Name IS NOT NULL AND ND.Name IS NULL);

要是有其他字段(比如价格、库存)需要对比,直接在WHERE条件里添加对应的字段判断即可。

额外实用技巧

  • 确保UPC是唯一标识字段,不然会出现重复匹配,影响结果准确性。
  • 数据量较大时,给UPC字段建立索引能大幅提升查询速度。
  • 可以把三类差异合并成一个结果集,方便统一查看:
-- 新增数据
SELECT '新增' AS Change_Type, UPC, Name AS Current_Name, NULL AS Old_Name
FROM ITEMS_032818 AS ND 
WHERE NOT EXISTS (SELECT 1 FROM ITEMS AS OD WHERE ND.UPC = OD.UPC)

UNION ALL

-- 删除数据
SELECT '删除' AS Change_Type, UPC, NULL AS Current_Name, Name AS Old_Name
FROM ITEMS AS OD 
WHERE NOT EXISTS (SELECT 1 FROM ITEMS_032818 AS ND WHERE OD.UPC = ND.UPC)

UNION ALL

-- 修改数据
SELECT '修改' AS Change_Type, OD.UPC, ND.Name AS Current_Name, OD.Name AS Old_Name
FROM ITEMS AS OD
JOIN ITEMS_032818 AS ND ON OD.UPC = ND.UPC
WHERE OD.Name <> ND.Name;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:43:09