在SQL表中查找重复值

使用一个字段很容易找到重复项:

选择电子邮件,计数(电子邮件)
来自用户
通过电子邮件分组
拥有计数(电子邮件)>1.

如果我们有一张桌子

ID NAME电子邮件
1约翰[email protected]
2萨姆[email protected]
3汤姆[email protected]
4鲍勃[email protected]
5汤姆[email protected]

此查询将为我们提供John、Sam、Tom、Tom,因为他们都有相同的电子邮件

但是,我想要的是使用相同的电子邮件和名称获得副本

也就是说,我想得到;“汤姆”&引用;汤姆

我需要它的原因是:我犯了一个错误,允许插入重复的名称电子邮件值。现在我需要删除/更改重复项,因此我需要先找到它们

选择
姓名、电子邮件、计数(*)
从…起
使用者
分组
姓名、电子邮件
有
计数(*)>1.

只需在两列上分组即可

注:较旧的ANSI标准是将所有非聚合列包含在GROUP BY中,但由于“函数依赖性”的思想,这一点发生了变化:

在关系数据库理论中,函数依赖是来自数据库的关系中两组属性之间的约束。换句话说,函数依赖关系是描述关系中属性之间关系的约束

支持不一致:

  • 最近的PostgreSQL支持它
  • SQL Server(截至SQL Server 2017)仍然需要GROUP BY中的所有非聚合列
  • MySQL是不可预测的,您需要sql\u mode=only\u full\u group\u by
    • 通过显示错误结果按名称顺序分组
    • 在没有任何()的情况下,哪一个聚合函数的开销最小(请参见接受答案中的注释)
  • 甲骨文不够主流(警告:幽默,我不了解甲骨文)

发表评论