使用一个字段很容易找到 duplicates
:
SELECT name, COUNT(email)
FROM users
GROUP BY email
HAVING COUNT(email) > 1
所以,如果我们有一张 table
ID NAME EMAIL
1 John asd@asd.com
2 Sam asd@asd.com
3 Tom asd@asd.com
4 Bob bob@asd.com
5 Tom asd@asd.com
这个查询会给我们John,Sam,Tom,Tom,因为他们都有相同的 email
.
但是,我想要的是使用相同的 email
和 name
获取重复项 .
也就是说,我想得到“汤姆”,“汤姆” .
我需要这个的原因:我犯了一个错误,并允许插入重复的 name
和 email
值 . 现在我需要 remove/change 重复,所以我需要先找到它们 .
25 回答
派对有点晚了,但我找到了一个很酷的解决方法来找到所有重复的ID:
如果你想看看你的表中是否有任何重复的行,我使用下面的查询:
只需在两个列上分组 .
注意:较旧的ANSI标准是在GROUP BY中包含所有非聚合列,但这已经改变了"functional dependency"的想法:
支持不一致:
最近的PostgreSQL supports it .
SQL Server(与SQL Server 2017一样)仍然需要GROUP BY中的所有非聚合列 .
MySQL是不可预测的,你需要
sql_mode=only_full_group_by
:GROUP BY lname ORDER BY showing wrong results;
Which is the least expensive aggregate function in the absence of ANY()(见接受答复中的评论) .
Oracle不了解Oracle) .
如果您使用Oracle,这种方式更可取:
我们可以使用这里有关于聚合函数的工作,如下所示
这里有两个字段id_account和数据与Count(*)一起使用 . 因此,它将提供在两列中具有多于一倍相同值的所有记录 .
我们有些错误地错过了在SQL服务器表中添加任何约束,并且已经在前端应用程序的所有列中插入了重复的记录 . 然后我们可以使用下面的查询从表中删除重复的查询 .
这里我们已经获取了原始表的所有不同记录并删除了原始表的记录 . 我们再次将新表中的所有不同值插入到原始表中,然后删除新表 .
如果要查找重复数据(通过一个或多个标准)并选择实际行 .
http://developer.azurewebsites.net/2014/09/better-sql-group-by-find-duplicate-data/
How to get duplicate record in table
SELECT COUNT(代码),代码FROM Employees WHERE状态= 1 GROUP BY代码具有COUNT(代码)> 1
试试这个:
这也应该有用,也许试一试 .
特别适用于您的情况如果您搜索具有某种前缀或一般更改的重复项,例如邮件中的新域名 . 那么你可以在这些列上使用replace()
试试这个:
OUTPUT:
如果你想要复制的ID使用这个:
OUTPUT:
要删除重复项,请尝试:
OUTPUT:
这将选择/删除除每组重复项中的一条记录之外的所有重复记录 . 因此,删除会从每组重复项中留下所有唯一记录一条记录 .
选择重复:
删除重复项:
注意大量记录,可能会导致性能问题 .
如果你想删除重复项,这里有一个更简单的方法,而不是在三重子选择中找到偶数/奇数行:
所以要删除:
更容易阅读和理解恕我直言
Note: 唯一的问题是您必须执行请求,直到没有删除任何行,因为每次只删除每个副本中的一个
By Using CTE also we can find duplicate value like this
我们如何计算重复的值?要么重复2次,要么重复2次 . 只计算它们,而不是按组计算 .
就像
这是我想出的容易的事情 . 它使用公用表表达式(CTE)和分区窗口(我认为这些功能在SQL 2008及更高版本中) .
此示例查找名称和dob重复的所有学生 . 要检查重复的字段位于OVER子句中 . 您可以在投影中包含所需的任何其他字段 .
请尝试以下方法:
SELECT id, COUNT(id) FROM table1 GROUP BY id HAVING COUNT(id)>1;
我认为这可以正常搜索特定列中的重复值 .
试试这段代码
SELECT column_name,COUNT(*) FROM TABLE_NAME GROUP BY column1, HAVING COUNT(*) > 1;