我们可以使用分析函数删除重复的行吗?我的意思是在Oracle的Sql查询中使用row_number()
或rank
或dense_rank()?
答案 0 :(得分:2)
您可以在对您而言唯一的列分区上使用ROW_NUMBER()
,例如:ROW_NUMBER() OVER (PARTITION BY COLUMN1, COLUMN2 ORDER BY COLUMN1)
。每个结果都有一个rownumber> 1是重复。
然后,您可以为这些返回rowid并删除它们。
答案 1 :(得分:1)
我们可以使用Analytical Functions
或任何其他方式,例如Aggregate Functions
,'DISTINCT`来查明我们的表格中是否有重复
喜欢使用Analytical Functions
select col1,col2,col3 from (select tbl.*,rowid rid,row_number() over (partition by col1,col2,col3 order by col1) rnum
from tbl) where rnum>1;
但要删除它们,我们需要获得ROWID
rnum>1
delete from tbl where rowid in
(select rid from (select tbl.*,rowid rid,row_number() over (partition by col1,col2,col3 order by col1) rnum
from tbl) where rnum>1)
或者我们可以简单地使用
create new_table as select distinct * from old_table
答案 2 :(得分:1)
按照以下步骤删除重复记录,而不使用rowid,rownum 1.创建表以存储原始表的不同值。
create table newtable as select distinct * from tablename;
从原始表中删除记录。
truncate table tablename;
将临时表值插入原始表。
insert into tablename select * from newtable;
答案 3 :(得分:0)
是。但是使用聚合函数可以使它更简单
-- delete duplicates
delete from table t1
where t1.rowid not in (
select min(t2.rowid)
from table t2
group by t2.col1, t2.col2, ...
)
答案 4 :(得分:0)
您可以使用以下查询删除重复的行:
DELETE FROM EMP
WHERE ROWID IN
(
SELECT RID FROM
(SELECT ROWID RID,ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY ROWID) R FROM EMP)
WHERE R>1
);
答案 5 :(得分:0)
假设我们要从 emp 表中删除重复的 sal:
select * from (
select
empno,
ename,
sal,
row_number() over (partition by sal order by sal asc) rw_number
from emp)
where rw_number = 1
答案 6 :(得分:-1)
这是你应该做的事情:
DELETE FROM emp
WHERE rowid IN (
SELECT rid
FROM (
SELECT rowid rid ,
DENSE_RANK() OVER ( PARTITION BY empno ORDER BY rowid ) rn
FROM emp
) AS RR
WHERE rn > 1 );