如何在Oracle的表中找到重复的值?


Answers:


608
SELECT column_name, COUNT(column_name)
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) > 1;

1
谢谢-这就是我刚刚找到的答案,您击败了我,将其重新发布在这里!:o)
Andrew

3
别客气。现在,我要对count(column)和count(*)之间的区别发表自己的问题。:)
比尔蜥蜴

44
四年后+1仍然有效,可以调整以选择多个列,只要这些列也位于中即可group by,例如:select column_one, column_two, count(*) from tablename group by column_one, column_two having count(column_one) > 1;
Amos M. Carpenter 2012年

4
甚至having count(*) > 1:D
Stanislav Mamontov

3
8年后+1仍然适用于Oracle和MySQL的最新版本(删除具有计数功能的行后删除空格)。
PhatHV

58

其他方式:

SELECT *
FROM TABLE A
WHERE EXISTS (
  SELECT 1 FROM TABLE
  WHERE COLUMN_NAME = A.COLUMN_NAME
  AND ROWID < A.ROWID
)

上有索引时,工作正常(足够快)column_name。这是删除或更新重复行的更好方法。


3
+1适用于多列重复项(例如,当您想在几列上添加UNIQUE约束时),我发现这种方法比“ GROUP BY”(列出必要的重复字段值+其他字段)的“刚性”低。
Frosty Z

3
只是为了澄清一下(首先对我来说这并不明显),该查询仅返回重复项,而不返回第一个原始条目,这就是为什么基于多个对象之间的唯一约束,它可以很好地删除重复项的原因1列。您可以通过此查询选择重复的ID,然后使用这些ID删除重复的ID。
matthewb 2012年

1
如果将<更改为!=,则将获得所有重复的记录。不只是第二或第三记录
moore1emu'1


17

如果您不需要知道重复的实际数量,则甚至不需要在返回的列中进行计数。例如

SELECT column_name
FROM table
GROUP BY column_name
HAVING COUNT(*) > 1

7

怎么样:

SELECT <column>, count(*)
FROM <table>
GROUP BY <column> HAVING COUNT(*) > 1;

为了回答上面的示例,它看起来像:

SELECT job_number, count(*)
FROM jobs
GROUP BY job_number HAVING COUNT(*) > 1;

5

如果多个列标识唯一行(例如,关系表),则可以使用以下命令

使用行ID,例如emp_dept(empid,deptid,startdate,enddate)假定empid和deptid是唯一的,并在这种情况下标识行

select oed.empid, count(oed.empid) 
from emp_dept oed 
where exists ( select * 
               from  emp_dept ied 
                where oed.rowid <> ied.rowid and 
                       ied.empid = oed.empid and 
                      ied.deptid = oed.deptid )  
        group by oed.empid having count(oed.empid) > 1 order by count(oed.empid);

如果该表具有主键,则使用主键而不是rowid,例如id为pk,

select oed.empid, count(oed.empid) 
from emp_dept oed 
where exists ( select * 
               from  emp_dept ied 
                where oed.id <> ied.id and 
                       ied.empid = oed.empid and 
                      ied.deptid = oed.deptid )  
        group by oed.empid having count(oed.empid) > 1 order by count(oed.empid);

4

在做

select count(j1.job_number), j1.job_number, j1.id, j2.id
from   jobs j1 join jobs j2 on (j1.job_numer = j2.job_number)
where  j1.id != j2.id
group by j1.job_number

将为您提供重复的行的ID。



2

我通常使用Oracle Analytic函数ROW_NUMBER()

假设你要检查你有关于一个唯一索引或建立在列的主键(重复的c1c2c3)。然后,您将采用这种方式,调出ROWIDs行,其中带来的行数ROW_NUMBER()>1

Select * From Table_With_Duplicates
      Where Rowid In
                    (Select Rowid
                       From (Select Rowid,
                                    ROW_NUMBER() Over (
                                            Partition By c1 || c2 || c3
                                            Order By c1 || c2 || c3
                                        ) nbLines
                               From Table_With_Duplicates) t2
                      Where nbLines > 1)

1

这是执行此操作的SQL请求:

select column_name, count(1)
from table
group by column_name
having count (column_name) > 1;

1

我知道它是一个旧线程,但这可能会有所帮助。

如果在检查以下重复使用时需要打印表的其他列:

select * from table where column_name in
(select ing.column_name from table ing group by ing.column_name having count(*) > 1)
order by column_name desc;

如果需要,还可以在where子句中添加一些其他过滤器。


0

1.解决方案

select * from emp
    where rowid not in
    (select max(rowid) from emp group by empno);

这张原始海报从未提及删除,只在计数
Jeff

-1

你也可以尝试这样的事情来列出表中的所有重复值说reqitem

SELECT count(poid) 
FROM poitem 
WHERE poid = 50 
AND rownum < any (SELECT count(*)  FROM poitem WHERE poid = 50) 
GROUP BY poid 
MINUS
SELECT count(poid) 
FROM poitem 
WHERE poid in (50)
GROUP BY poid 
HAVING count(poid) > 1;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.