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

And*_*rew 267 sql oracle duplicate-data

什么是最简单的SQL语句,它将返回给定列的重复值及其在Oracle数据库表中的出现次数?

例如:我有一个JOBS包含列的表JOB_NUMBER.我怎样才能知道我是否有任何副本JOB_NUMBER,以及它们被复制了多少次?

Bil*_*ard 588

SELECT column_name, COUNT(column_name)
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) > 1;
Run Code Online (Sandbox Code Playgroud)

  • 4年后+1,仍然运行良好,并且可以调整以选择多个列,只要它们也在`group by`中,如:`select column_one,column_two,count(*)from tablename group by column_one ,column_two有count(column_one)> 1;`等 (44认同)
  • 甚至`有计数(*)> 1`:D (4认同)
  • 别客气.现在我要发表关于count(列)和count(*)之间差异的问题.:) (3认同)
  • 超过8年后的+1,仍然适用于最新版本的Oracle和MySQL(在拥有行后计数功能后删除空格). (3认同)
  • +1这也适用于SQL Server 2005. (2认同)

小智 57

其他方式:

SELECT *
FROM TABLE A
WHERE EXISTS (
  SELECT 1 FROM TABLE
  WHERE COLUMN_NAME = A.COLUMN_NAME
  AND ROWID < A.ROWID
)
Run Code Online (Sandbox Code Playgroud)

当有索引时,工作正常(足够快)column_name.并且它是删除或更新重复行的更好方法.

  • +1适用于多列重复(例如,当您想在多个列上添加UNIQUE约束时),我发现这种方法不如GROUP BY那样"严格"列出重复字段值+必要时的其他字段. (3认同)
  • 只是为了澄清,(这对我来说一点都不明显)这个查询只返回重复项,它不返回第一个原始条目,这就是为什么它可以很好地删除重复项,基于一个独特的约束1列.您可以使用此查询选择重复的ID,然后使用这些ID删除重复项. (3认同)
  • 如果将 &lt; 更改为 != 您将获得所有重复的记录。不仅仅是第二或第三条记录 (2认同)

Jos*_*ons 32

最简单的我能想到:

select job_number, count(*)
from jobs
group by job_number
having count(*) > 1;
Run Code Online (Sandbox Code Playgroud)

  • 从job_number所在的作业中选择*(按作业组选择job_number,按job_number计算(*)> 1) (2认同)

Eva*_*van 17

如果您不需要知道重复的实际数量,则不需要在返回的列中包含计数.例如

SELECT column_name
FROM table
GROUP BY column_name
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)


And*_*rew 7

怎么样:

SELECT <column>, count(*)
FROM <table>
GROUP BY <column> HAVING COUNT(*) > 1;
Run Code Online (Sandbox Code Playgroud)

要回答上面的例子,它看起来像:

SELECT job_number, count(*)
FROM jobs
GROUP BY job_number HAVING COUNT(*) > 1;
Run Code Online (Sandbox Code Playgroud)


Jit*_*ute 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);
Run Code Online (Sandbox Code Playgroud)

如果这样的表有主键,那么使用主键而不是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);
Run Code Online (Sandbox Code Playgroud)


J. *_*mel 5

我通常使用Oracle 分析函数ROW_NUMBER()

c1假设您要检查关于基于列 ( 、c2、 )构建的唯一索引或主键的重复项c3。然后你将这样走,调出ROWIDs 行,其中所带来的行数ROW_NUMBER()>1

Select *
From Table_With_Duplicates
Where Rowid In (Select Rowid
                  From (Select ROW_NUMBER() Over (
                                 Partition By c1, c2, c3
                                 Order By c1, c2, c3
                               ) nbLines
                          From Table_With_Duplicates) t2
                 Where nbLines > 1)
Run Code Online (Sandbox Code Playgroud)