Sql 使用分析函数删除重复行

Sql 使用分析函数删除重复行,sql,oracle,duplicates,rows,analytical,Sql,Oracle,Duplicates,Rows,Analytical,我们可以使用分析函数删除重复的行吗?我的意思是在Oracle的Sql查询中使用row\u number()或rank或densite\u rank()?是。但使用聚合函数可以使它变得更简单一些 -- delete duplicates delete from table t1 where t1.rowid not in ( select min(t2.rowid) from table t2 group by t2.col1, t2.col2, ... ) 是的。但使用聚合函

我们可以使用分析函数删除重复的行吗?我的意思是在Oracle的Sql查询中使用
row\u number()
rank
或densite\u rank()?

是。但使用聚合函数可以使它变得更简单一些

-- delete duplicates
delete from table t1
where t1.rowid not in (
   select min(t2.rowid)
   from table t2
   group by t2.col1, t2.col2, ...
)

是的。但使用聚合函数可以使它变得更简单一些

-- delete duplicates
delete from table t1
where t1.rowid not in (
   select min(t2.rowid)
   from table t2
   group by t2.col1, t2.col2, ...
)

您可以在对您来说应该是唯一的列分区上使用
行编号()
,例如:
行编号()在(按列1分区,按列1排序的列2)
。rownumber大于1的每个结果都是重复的


例如,您可以返回这些列的rowid并将其删除。

您可以在对您来说应该是唯一的列分区上使用
ROW\u NUMBER()
,例如:
ROW\u NUMBER()over(按列1分区,按列2排序)
。rownumber大于1的每个结果都是重复的


例如,您可以返回这些函数的rowid并将其删除。

我们可以使用
分析函数
或任何其他方式,如
聚合函数
,“DISTINCT`来确定表中是否有重复项

喜欢使用
分析函数

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;
但是要删除它们,我们需要获得那些
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

我们可以使用
分析函数
或任何其他方式,如
聚合函数
,“DISTINCT”来确定表中是否有重复项

喜欢使用
分析函数

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;
但是要删除它们,我们需要获得那些
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

按照以下步骤删除重复记录,而不使用rowid、rownum 1.创建表以存储原始表的不同值

    create table newtable as select distinct * from tablename;
 truncate table tablename;
 insert into tablename select * from newtable; 
  • 从原始表中删除记录

        create table newtable as select distinct * from tablename;
    
     truncate table tablename;
    
     insert into tablename select * from newtable; 
    
  • 将临时表值插入到原始表中

        create table newtable as select distinct * from tablename;
    
     truncate table tablename;
    
     insert into tablename select * from newtable; 
    

  • 按照以下步骤删除重复记录,而不使用rowid、rownum 1.创建表以存储原始表的不同值

        create table newtable as select distinct * from tablename;
    
     truncate table tablename;
    
     insert into tablename select * from newtable; 
    
  • 从原始表中删除记录

        create table newtable as select distinct * from tablename;
    
     truncate table tablename;
    
     insert into tablename select * from newtable; 
    
  • 将临时表值插入到原始表中

        create table newtable as select distinct * from tablename;
    
     truncate table tablename;
    
     insert into tablename select * from newtable; 
    

  • 这是你应该做的事情:

    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 );
    

    这是你应该做的事情:

    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 );
    

    您可以使用以下查询删除重复的行:

    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
    );
    

    您可以使用以下查询删除重复的行:

    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
    );
    

    假设我们要从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
    

    假设我们要从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
    


    你的要求不太清楚。试着写下你想处理的查询,并将其发布在这里(如果你收到任何错误消息的话),这样人们就会更好地了解你到底想要什么。这个问题的答案是:“是的”。如果你能像Mat建议的那样解释你要做的事情,也许有人能帮上点忙,提供一个更全面的解释。我正在尝试删除重复的行。我知道在oracl中使用rowid也可以做到这一点。。还有其他方法吗?除非生成比需要更大的资源密集型sql语句。你真的不想使用rowid的原因是什么?我只是想知道在没有rowid的情况下,使用分析函数是否可以做到这一点!!你的要求不太清楚。试着写下你想处理的查询,并将其发布在这里(如果你收到任何错误消息的话),这样人们就会更好地了解你到底想要什么。这个问题的答案是:“是的”。如果你能像Mat建议的那样解释你要做的事情,也许有人能帮上点忙,提供一个更全面的解释。我正在尝试删除重复的行。我知道在oracl中使用rowid也可以做到这一点。。还有其他方法吗?除非生成比需要更大的资源密集型sql语句。你真的不想使用rowid的原因是什么?我只是想知道在没有rowid的情况下,使用分析函数是否可以做到这一点!!我相信我们不能用别名或像
    t1这样的表名来引用
    rownum
    ,因为
    rownum
    ORACLE
    @Aspirant中的保留工作-谢谢。已修复。我们无法使用删除rownum@JebySebastian-不要再吵闹了!:)@Egor,还有其他方法吗?我相信我们不能用别名或表名来引用
    rownum
    ,比如
    t1。rownum
    ,因为
    rownum
    ORACLE
    @Aspirant中的保留工作-谢谢。已修复。我们无法使用删除rownum@JebySebastian-不要再吵闹了!:)@Egor,还有其他方法吗?我知道如何使用rowid删除。但是,我正在搜索一个不使用rowid的解决方案。如果不使用rowid,我不这么认为,只需创建一个具有原始表的不同值的虚拟表:)我只是想知道是否可以在不使用rowid的情况下使用分析函数来完成此操作!!我知道如何使用rowid删除。但是,我正在搜索一个不使用rowid的解决方案。如果不使用rowid,我不这么认为,只需创建一个具有原始表的不同值的虚拟表:)我只是想知道是否可以在不使用rowid的情况下使用分析函数来完成此操作!!我知道如何使用rowid删除。但是,我正在寻找一种不使用rowidy的解决方案。您无法在一条语句中使用分析函数删除行。您可以使用多个语句将唯一的行放入自己的表中。然后用这个唯一的数据替换当前表。我知道如何使用rowid删除。但是,我正在寻找一种不使用rowidy的解决方案。您无法在一条语句中使用分析函数删除行。您可以使用多个语句将唯一的行放入自己的表中。而不是用这些独特的数据替换当前表。我怀疑这是否有帮助,甚至根本不起作用。为了说服我,请解释一下这一点