SQL如何合并仅存在空值差异的查询结果且不丢失有效数据
空值差异记录合并SQL实现方案
核心逻辑是先以姓名(FirstName+LastName)为唯一分组标识,分别提取每个分组下所有非空、去重的各字段值,再通过分组标识关联,即可得到无空值冗余、不丢失有效多值的合并结果。
示例实现代码如下:
WITH base_groups AS ( -- 提取所有需要保留的基础分组 SELECT DISTINCT FirstName, LastName FROM your_table ), distinct_emails AS ( -- 提取每个分组下非空去重的邮箱值 SELECT FirstName, LastName, Email FROM your_table WHERE Email IS NOT NULL AND TRIM(Email) != '' GROUP BY FirstName, LastName, Email ), distinct_phones AS ( -- 提取每个分组下非空去重的手机号值 SELECT FirstName, LastName, Phone FROM your_table WHERE Phone IS NOT NULL AND TRIM(Phone) != '' GROUP BY FirstName, LastName, Phone ) SELECT b.FirstName, b.LastName, e.Email, p.Phone FROM base_groups b LEFT JOIN distinct_emails e ON b.FirstName = e.FirstName AND b.LastName = e.LastName LEFT JOIN distinct_phones p ON b.FirstName = p.FirstName AND b.LastName = p.LastName ORDER BY b.FirstName, b.LastName;
逻辑说明
- 单个分组下某字段只有一个非空有效值时,会自动补全到其他字段的所有多值行中,符合Bob、Mary的合并需求
- 单个分组下某字段有多个不同非空有效值时,会保留全部有效值生成对应行数,符合Taylor保留两条不同手机号记录的需求
- 自动过滤所有仅空值差异的冗余记录,不会出现DISTINCT查询带出的空值行
- 如果需要合并的字段更多,只需按照相同逻辑新增对应字段的去重CTE,关联到基础分组表即可
- 可根据数据库特性调整空值判断逻辑,比如部分场景不需要判断空字符串,仅保留
IS NOT NULL条件即可
内容的提问来源于stack exchange,提问作者Isaac Reefman
相关产品推荐
相关产品推荐

