查找数据库中的重复行
Posted
技术标签:
【中文标题】查找数据库中的重复行【英文标题】:Find duplicate rows in database 【发布时间】:2010-09-22 21:21:37 【问题描述】:如何查找重复行?如果 last_name 是重复字段,我想必须显示
last_name frst_name frst_name1 frst_name2 ....
任何数据库都可以,首选 oracle。
【问题讨论】:
您使用的是哪个数据库服务器? 每个数据库都有自己的配方,但这些是特定于数据库的。 我的意思是获取一份副本的不同技巧,但详细信息如 row_id、row_num 不同。但我误解了 OP 的问题。 【参考方案1】:这应该适用于几乎所有 SQL 方言:
SELECT last_name, first_name FROM names
WHERE last_name IN (
SELECT last_name FROM names GROUP BY last_name HAVING COUNT(*) > 1
)
不过,它会给你一个这样的结果集:
Smith Jack
Smith Joe
Smith Anna
Sixpack Joe
Sixpack Eve
以 IMO 所需格式显示此内容的最优雅的解决方案是在客户端应用程序中以编程方式重新排列结果集,而不是使用各种晦涩的 SQL 噱头;类似(伪代码):
for each row in resultset
if row[last_name] <> previous_last_name
print newline, print last_name
print ' '
print first_name
【讨论】:
【参考方案2】:假设您的服务器具有 GROUP_CONCAT,因为您没有提及您使用的是哪一个:
SELECT GROUP_CONCAT(first_name SEPARATOR ' ')
FROM table
GROUP BY last_name
HAVING COUNT(first_name) > 1
【讨论】:
我非常喜欢这个!不过,目前GROUP_CONCAT
仅在 mysql 中实现。以下链接中有 Oracle 版本,同一个博客也有 PostGreSQL 和 SQL Server 版本。 explainextended.com/2009/04/05/group_concat-in-oracle-10g
@eksortso:SQLite 也支持 GROUP_CONCAT 函数。【参考方案3】:
哈,很多问题。这里还有更多
SELECT last_name, first_name FROM names n1
WHERE
(
SELECT count(*) FROM names n2 where n2.last_name = n1.last_name
)
> 1
或者如果表有唯一标识符
SELECT last_name, first_name FROM names n1
WHERE exists
(
SELECT id FROM names n2 where n2.last_name = n1.last_name and n1.id <> n2.id
)
【讨论】:
【参考方案4】:Select a.* from persons a inner join persons b on (a.personID<>b.PersonID and a.last_name=b.last_name)
PersonID 是表的主键。
【讨论】:
【参考方案5】:我不知道这是否是您所要求的,但我认为您正在寻找的是
SELECT * FROM users u1, users u2
WHERE (u1.last_name = u2.last_name AND COUNT(u1.last_name) > 1))
【讨论】:
如果您的姓氏非常受欢迎,那么您会得到很多重复。 我刚刚回答了这个问题...如果您还想检查其他字段,那么您只需使用 DISTINCT 选项将它们添加到 WHERE 子句中。跨度> 不能在子查询之外的 WHERE 子句中使用聚合 (IE: COUNT)。修复该错误后,SELECT *
将从USERS
表的两个副本中返回行【参考方案6】:
我尝试设计一种适用于大多数符合 ANSI 的 SQL 数据库服务器的解决方案。这是我想出的。
这里的想法是您识别重复的last_name
s,然后提取具有这些重复之一的所有记录。
SELECT
t.last_name, t.frst_name, t.frst_name1, t.frst_name2, ...
FROM our_table AS t
WHERE t.last_name IN (
SELECT t0.last_name
FROM our_table AS t0
GROUP BY t0.last_name
HAVING COUNT(*) > 1
)
ORDER BY
t.last_name, t.frst_name, t.frst_name1, t.frst_name2, ...
;
【讨论】:
【参考方案7】:假设“在客户表中,您有 customerkey 作为 PK”,那么您可以使用:
select
customerkey,count(customerkey)
from
customer
group
by customerkey
having
count(customerkey)>1;
这将为您提供所有重复的客户密钥。现在您可以删除它们了。
【讨论】:
以上是关于查找数据库中的重复行的主要内容,如果未能解决你的问题,请参考以下文章