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

如何合并含公共与非公共列的两表记录并去重保留指定字段值

解决两表合并去重并保留指定字段值的SQL方案

原语句问题分析

  • 未以Patient ID、Check_in_Date、order_name作为重复判断的核心键,反而依赖可能重复的Name字段,且未包含Patient_ID,导致重复判断逻辑错误。
  • 为table2的preformed_by赋值空字符串后,当两表存在相同核心键的记录时,会因preformed_by值不同被UNION保留,最终产生重复记录。

方法一:筛选table2独有记录后合并(高效去重)

先获取table1的全部记录,再补充table2中未在table1出现过的记录(按核心键匹配),用UNION ALL避免额外去重开销:

-- 取table1所有记录
SELECT Patient_ID, Name, Check_in_Date, order_name, preformed_by
FROM table1
UNION ALL
-- 取table2中与table1无匹配核心键的记录
SELECT t2.Patient_ID, t2.Name, t2.Check_in_Date, t2.order_name, '' AS preformed_by
FROM table2 t2
WHERE NOT EXISTS (
    SELECT 1
    FROM table1 t1
    WHERE t1.Patient_ID = t2.Patient_ID
      AND t1.Check_in_Date = t2.Check_in_Date
      AND t1.order_name = t2.order_name
)

方法二:全外连接+COALESCE(逻辑直观)

通过全外连接合并两表所有记录,再用COALESCE优先选择table1的字段值,确保核心键重复时保留table1的preformed_by:

SELECT 
    COALESCE(t1.Patient_ID, t2.Patient_ID) AS Patient_ID,
    COALESCE(t1.Name, t2.Name) AS Name,
    COALESCE(t1.Check_in_Date, t2.Check_in_Date) AS Check_in_Date,
    COALESCE(t1.order_name, t2.order_name) AS order_name,
    COALESCE(t1.preformed_by, '') AS preformed_by
FROM table1 t1
FULL OUTER JOIN table2 t2
    ON t1.Patient_ID = t2.Patient_ID
    AND t1.Check_in_Date = t2.Check_in_Date
    AND t1.order_name = t2.order_name

方案说明

  • 方法一适合数据量较大的场景,NOT EXISTS的过滤逻辑效率更高,且UNION ALL无需额外去重操作。
  • 方法二逻辑更清晰,能直观体现两表的对应关系,适合需要排查数据匹配情况的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:45:17