SQL中基于Email字段去除表重复行并获取无重复数据的技术问题
基于Email字段筛选无重复的完整记录
问题分析
你当前使用的SELECT DISTINCT Email FROM Users仅能返回去重后的Email值,无法获取完整的行记录,也无法排除那些Email重复出现的所有行(比如示例中sam@gmail.com出现两次,你的需求是完全排除这两行,只保留Email唯一的记录)。
解决方案
以下是两种常用的实现方式,可根据你的SQL方言(如MySQL、PostgreSQL、SQL Server等)选择合适的方法:
方法1:GROUP BY + HAVING 关联原表
先统计每个Email的出现次数,筛选出仅出现一次的Email,再关联原表获取完整记录:
SELECT u.* FROM Users u JOIN ( SELECT Email FROM Users WHERE Email IS NOT NULL -- 排除空值Email的情况,按需调整 GROUP BY Email HAVING COUNT(*) = 1 ) AS unique_emails ON u.Email = unique_emails.Email
方法2:窗口函数(适用于支持窗口函数的数据库)
使用COUNT() OVER()窗口函数标记每行Email的出现次数,筛选次数为1的行:
SELECT Id, Email, Username FROM ( SELECT *, COUNT(*) OVER(PARTITION BY Email) AS email_count FROM Users WHERE Email IS NOT NULL ) AS temp WHERE email_count = 1
说明
- 语句中
WHERE Email IS NOT NULL用于排除示例表中的空Email行,若业务允许保留空Email的唯一行,可移除该条件。 - 示例表中
sam@gmail.com出现两次,因此这两行都会被排除,最终结果与你期望的一致。
内容的提问来源于stack exchange,提问作者ProMahmudul
相关产品推荐
相关产品推荐

