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完全一致:
| Id | FirstName | LastName | DrinkPreference |
|---|---|---|---|
| 123 | Tom | Bannon | Coke/Pepsi |
| 124 | Sarah | Smith | Pepsi |
| 125 | Jim | Henry | Coke |
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

