当前位置:  开发笔记 > 后端 > 正文

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

如何解决《如何在Oracle中的表中找到重复值?》经验,为你挑选了6个好方法。

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

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



1> Bill the Liz..:
SELECT column_name, COUNT(column_name)
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) > 1;


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

2> 小智..:

其他方式:

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

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


+1适用于多列重复(例如,当您想在多个列上添加UNIQUE约束时),我发现这种方法不如GROUP BY那样"严格"列出重复字段值+必要时的其他字段.
只是为了澄清,(这对我来说一点都不明显)这个查询只返回重复项,它不返回第一个原始条目,这就是为什么它可以很好地删除重复项,基于一个独特的约束1列.您可以使用此查询选择重复的ID,然后使用这些ID删除重复项.

3> JosephStyons..:

最简单的我能想到:

select job_number, count(*)
from jobs
group by job_number
having count(*) > 1;


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

4> Evan..:

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

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



5> Andrew..:

怎么样:

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


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

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



6> Jitendra Vis..:

如果多列标识唯一行(例如关系表),您可以使用以下内容

使用行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);

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有