0

Oracle 8,1にデータテーブルがあります。約100万行あります。しかし、同じ列で多くの行が重複しています。このデータをクリアする最速の方法を知る必要があります。たとえば、私は持っています:

id name surname date
21 'john' 'smith' '2012 12 12'; 
21 'john' 'smith' '2012 12 13';
21 'john' 'smith' '2012 12 14';
....

そして今、最初の 2 行は最初の 3 列で重複しているため削除し、行を最新の日付に保つ必要があります。

4

3 に答える 3

2

重複が本当に多い場合は、クリーンなデータのみを使用してテーブルを再作成することをお勧めします。

CREATE TABLE tmp AS 
SELECT id, name, surname, max(d) as d
   FROM t
  GROUP BY id, name, surname;

次に、元のテーブルを元のテーブルに置き換えます。

RENAME your_table TO old_table;
RENAME tmp_table TO your_table;

インデックス、制約、特権を移動することを忘れないでください...

于 2013-01-07T10:15:30.787 に答える
1
delete from table t where
exists (select * from table where id=t.id and name=t.name and surname=t.surname
        and date > t.date)

これがどれだけ速いかは、Oracleパラメータによって異なります。そして、(id、name、surname)のインデックスが役立つかもしれません。

于 2013-01-07T10:03:20.093 に答える
1

可能であれば、CTAS (テーブルを選択として作成) を使用し、元のテーブルを切り捨て、データをコピーして戻します。

-- create the temp table (it contains only the latest values for a given (id, name, surname) triple
CREATE TABLE tmp as 
SELECT id, name, surname, date1 from 
(select 
  t1.*, 
  row_number() over (partition by id, name, surname order by date1 desc) rn
from mytab t1)
where rn = 1;

-- clear the original table
TRUNCATE TABLE mytab;

-- copy the data back
INSERT /* +APPEND */ INTO mytab(id,name,surname,date1) 
  (SELECT id,name,surname,date1 from tmp);
于 2013-01-07T10:09:27.323 に答える