0

分析関数を使用して重複行を削除できますか? row_number()Oracle の SQL クエリでorrankまたは dense_rank()を使用するということですか?

4

8 に答える 8

3

ROW_NUMBER()たとえば、一意である必要がある列のパーティションで使用できますROW_NUMBER() OVER (PARTITION BY COLUMN1, COLUMN2 ORDER BY COLUMN1)。行番号が 1 より大きいすべての結果は重複しています。

たとえば、それらのROWIDを返して削除することができます。

于 2013-03-18T08:59:51.927 に答える
1

はい。しかし、集計関数を使用して少し簡単にすることができます

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

フィドル

于 2013-03-18T08:45:51.617 に答える
1

Analytical Functionsまたは、「DISTINCT」のような他の方法を使用Aggregate Functionsして、テーブルに重複があるかどうかを確認できます

使うのが好き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
于 2013-03-18T09:10:53.480 に答える
1

次の手順に従って、rowid、rownum を使用せずに重複レコードを削除します。 1. 元のテーブルの個別の値を格納するテーブルを作成します。

    create table newtable as select distinct * from tablename;
  1. 元のテーブルからレコードを削除します。

     truncate table tablename;
    
  2. 一時テーブルの値を元のテーブルに挿入します。

     insert into tablename select * from newtable; 
    
于 2014-02-03T12:22:41.927 に答える
0
DELETE FROM emp 
WHERE rowid IN
(
    SELECT rid from
    (
        SELECT rowid AS rid,
        DENSE_RANK() OVER(PARTITION BY empno ORDER BY rowid) AS rn
        FROM emp
    )
    WHERE rn > 1
);

RANK()ここでは、との両方を使用できます。DENSE_RANK()これは、 で並べ替えたときに両方が一意のレコードを提供するためrowidです。

于 2021-10-04T21:39:28.103 に答える
-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 );
于 2016-03-01T18:00:12.870 に答える