zoukankan      html  css  js  c++  java
  • 利用row_number over 函数删除重复记录

    开窗函数          
         Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行


    SQL> create table a1(id int,flag1 char(10),flag2 char(10));

    Table created.

    SQL> select * from a1;

     ID FLAG1      FLAG2
    ---------- ---------- ----------
      1 a       a1
      1 a       a2
      1 b       b1
      1 b       b2

    SQL>  delete from (select unique a.* from a1 a);
     delete from (select unique a.* from a1 a)
                 *
    ERROR at line 1:
    ORA-01732: data manipulation operation not legal on this view

    SQL> delete from (select * from (select unique a.* from a1 a));
    delete from (select * from (select unique a.* from a1 a))
                *
    ERROR at line 1:
    ORA-01752: cannot delete from view without exactly one key-preserved table


    SQL> delete from (select * from a1 group by id,name);
    delete from (select * from a1 group by id,name)
                *
    ERROR at line 1:
    ORA-01732: data manipulation operation not legal on this view

    SQL>  select a.*,row_number() over(partition by id,flag1 order by id,flag1) as num from a1 a;

     ID FLAG1      FLAG2  NUM
    ---------- ---------- ---------- ----------
      1 a       a1    1
      1 a       a2    2
      1 b       b1    1
      1 b       b2    2

    SQL> delete from (select a.*,row_number() over(partition by id,flag1 order by id,flag1) as num from a1 a) where num>1;
    delete from (select a.*,row_number() over(partition by id,flag1 order by id,flag1) as num from a1 a) where num>1
                *
    ERROR at line 1:
    ORA-01732: data manipulation operation not legal on this view


    SQL> (select a.*,
                                row_number() over(partition by id, flag1 order by id, flag1) as num
                           from a1 a)  2    3  ;

     ID FLAG1      FLAG2  NUM
    ---------- ---------- ---------- ----------
      1 a       a1    1
      1 a       a2    2
      1 b       b1    1
      1 b       b2    2

    SQL> delete from a1 where rowid in  (select rowid
                   from (select a.*,
                                row_number() over(partition by id, flag1 order by id, flag1) as num
                           from a1 a)a
                  where num >= 2)  2    3    4    5 
      6  ;

    2 rows deleted.

    SQL> commit;

    Commit complete.

    SQL> select * from a1;

     ID FLAG1      FLAG2
    ---------- ---------- ----------
      1 a       a1
      1 b       b1

  • 相关阅读:
    Linux之cd、pwd、mkdir、rmdir
    Linux之目录结构配置
    Linux之chgrp
    Linux之chown
    Linux之chmod
    Linux之用户组、文件权限详解
    Linux命令之shutdown
    Linux命令之man
    Git-.gitignore配置
    Linux内核移植到JZ2440
  • 原文地址:https://www.cnblogs.com/zhaoyangjian724/p/3798082.html
Copyright © 2011-2022 走看看