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

SQL两表合并时根据ID重复情况修改DrinkPreference字段的方法

解决方案

这个需求完全可以实现,不需要先UNION合并再用DISTINCT去重后二次修改,直接通过关联判断Id的存在场景就能一步生成目标Table #3。

核心逻辑

  • 先匹配两张表的联系人Id,区分三类数据:仅在Table #1存在、仅在Table #2存在、两张表同时存在
  • 两张表同时存在的Id,DrinkPreference固定赋值为Coke/Pepsi,姓名信息直接取任意表的对应值即可(重复Id的姓名信息完全一致)
  • 仅在单表存在的Id,直接取对应表存储的姓名和饮品偏好值即可

参考SQL

支持全外连接的数据库(PostgreSQL、SQL Server、Oracle等)可以直接用全外连接写法,逻辑最直观:

SELECT
    COALESCE(t1.Id, t2.id) AS Id,
    COALESCE(t1.FirstName, t2.FirstName) AS FirstName,
    COALESCE(t1.LastName, t2.LastName) AS LastName,
    CASE
        WHEN t1.Id IS NOT NULL AND t2.id IS NOT NULL THEN 'Coke/Pepsi'
        ELSE COALESCE(t1.DrinkPreference, t2.DrinkPreference)
    END AS DrinkPreference
FROM `Table #1` t1
FULL OUTER JOIN `Table #2` t2
    ON t1.Id = t2.id;

如果是不支持全外连接的数据库(比如MySQL),可以用先合并再分组聚合的写法,效果完全一致:

WITH all_contact AS (
    SELECT Id, FirstName, LastName, DrinkPreference FROM `Table #1`
    UNION ALL
    SELECT id AS Id, FirstName, LastName, DrinkPreference FROM `Table #2`
)
SELECT
    Id,
    MAX(FirstName) AS FirstName,
    MAX(LastName) AS LastName,
    CASE
        WHEN COUNT(Id) = 2 THEN 'Coke/Pepsi'
        ELSE MAX(DrinkPreference)
    END AS DrinkPreference
FROM all_contact
GROUP BY Id;

执行结果

运行上述代码后输出的结果和预期的Table #3完全一致:

IdFirstNameLastNameDrinkPreference
123TomBannonCoke/Pepsi
124SarahSmithPepsi
125JimHenryCoke

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:09:37