在数据库中查找重复的行

时间:2010-09-22 21:21:38

标签: sql database oracle

如何找到重复的行?如果last_name是重复字段,我想要显示

last_name frst_name frst_name1 frst_name2 ....  

任何数据库都可以,更喜欢oracle。

7 个答案:

答案 0 :(得分:12)

这几乎适用于所有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

答案 1 :(得分:6)

假设你的服务器有GROUP_CONCAT,因为你没有提到你正在使用的那个:

SELECT GROUP_CONCAT(first_name SEPARATOR ' ')
FROM table
GROUP BY last_name
HAVING COUNT(first_name) > 1

答案 2 :(得分: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
) 

答案 3 :(得分:2)

Select a.* from persons a inner join persons b on (a.personID<>b.PersonID and a.last_name=b.last_name)

PersonID是您桌子的主键。

答案 4 :(得分:2)

我不知道这是不是你要求的,但我认为你在寻找的是

SELECT * FROM users u1, users u2 
WHERE (u1.last_name = u2.last_name AND COUNT(u1.last_name) > 1))

答案 5 :(得分:1)

我尝试设计一种适用于大多数符合ANSI标准的SQL数据库服务器的解决方案。这就是我想出来的。

这里的想法是,您确定重复的last_name,然后提取所有具有其中一个重复项的记录。

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, ...
;

答案 6 :(得分:0)

假设&#34;在表客户中,您将客户密钥作为PK&#34;然后你可以使用:

select 
    customerkey,count(customerkey) 
from 
    customer 
group 
    by customerkey
having 
    count(customerkey)>1;

这将为您提供所有重复的customerkeys。现在你可以删除它们。