如何使用SQL查找表中某一列文本重复的行
提取数据库中某列存在重复值的行
需求说明
从数据库表中筛选出指定列(示例中为mail列)存在重复值的所有行,保留这些重复行的完整记录。
示例数据
原表:
| id | |
|---|---|
| 01 | dave.green@mail.com |
| 02 | joe.smith@mail.com |
| 03 | dave.green@mail.com |
| 04 | annie.white@mail.com |
| 05 | alice.inc@mail.com |
| 06 | ralph.lauren@mail.com |
期望结果:
| id | |
|---|---|
| 01 | dave.green@mail.com |
| 03 | dave.green@mail.com |
解决方案
以下提供两种通用的SQL实现方式,适用于大多数主流数据库:
方法1:分组子查询
先通过分组统计找出存在重复的mail值,再基于这些值筛选原表中的对应行:
SELECT id, mail FROM your_table WHERE mail IN ( SELECT mail FROM your_table GROUP BY mail HAVING COUNT(*) > 1 ) ORDER BY mail;
方法2:窗口函数(适用于MySQL 8+、PostgreSQL、SQL Server等)
使用窗口函数直接为每行标记对应mail的出现次数,再筛选次数大于1的行:
SELECT id, mail FROM ( SELECT id, mail, COUNT(*) OVER (PARTITION BY mail) AS mail_count FROM your_table ) AS subquery WHERE mail_count > 1 ORDER BY mail;
说明
- 需将语句中的
your_table替换为你的实际表名 - 两种方法都能得到目标结果,窗口函数的方式在处理大数据量时性能可能更优
内容的提问来源于stack exchange,提问作者Salvo Danilo
相关产品推荐
相关产品推荐

