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)
小智 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.并且它是删除或更新重复行的更好方法.
Jos*_*ons 32
最简单的我能想到:
select job_number, count(*)
from jobs
group by job_number
having count(*) > 1;
Run Code Online (Sandbox Code Playgroud)
Eva*_*van 17
如果您不需要知道重复的实际数量,则不需要在返回的列中包含计数.例如
SELECT column_name
FROM table
GROUP BY column_name
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)
怎么样:
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)
如果多列标识唯一行(例如关系表),您可以使用以下内容
使用行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)
我通常使用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)