使用一个字段很容易找到重复项:
选择电子邮件,计数(电子邮件)
来自用户
通过电子邮件分组
拥有计数(电子邮件)>;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
:- 通过显示错误结果按名称顺序分组
- 在没有任何()的情况下,哪一个聚合函数的开销最小(请参见接受答案中的注释)
- 甲骨文不够主流(警告:幽默,我不了解甲骨文)