複合主キー(a、b)を持つテーブルがあります。一時テーブルでバックアップを取りましたが、重複したレコードが発生しました。現在、バックアップ レコードをメイン テーブルに移動できません。
2 つの列に基づいて一時テーブルの重複を削除する方法をお勧めします。テーブルは oracle テーブルで、約 400 万の重複レコードが 7,000 万件あります
複合主キー(a、b)を持つテーブルがあります。一時テーブルでバックアップを取りましたが、重複したレコードが発生しました。現在、バックアップ レコードをメイン テーブルに移動できません。
2 つの列に基づいて一時テーブルの重複を削除する方法をお勧めします。テーブルは oracle テーブルで、約 400 万の重複レコードが 7,000 万件あります
次の 2 つのオプションがあります。
2 番目の方法はより効率的で、次のステートメントを使用して実行できます。
INSERT INTO target_table (a,b,c,d,e,f)
SELECT a,b,max(c),max(d),max(e),max(f)
FROM source_table
GROUP BY a,b;
別の方法として (たとえば、一部の列がCLOB
orとして定義されてLONG
いて、それらに max() を適用できない場合):
INSERT INTO target_table (a,b,c,d,e,f)
SELECT a,b,c,d,e,f
FROM (
SELECT a,b,c,d,e,f,
row_number() over (partition by a,b) as rn
FROM source_table
)
WHERE rn = 1;
最初に行を削除したい場合は、次のステートメントを使用してこれを行うことができます。
DELETE FROM source_table
WHERE rowid NOT IN (SELECT min(rowid)
FROM source_table
GROUP BY a,b
HAVING count(*) > 1)
次のようなデータがあるとします
1 user1 1
2 user1 1
3 user1 1
4 user1 3
5 user1 9
6 user2 1
7 user2 1
8 user2 10
9 user3 97
ここでは、user1(3) と user2(1) に繰り返しレコードがあります。
このクエリでは、大文字と小文字が繰り返されるレコードのみが表示されます。したがって、user1 の 3 つのレコードではなく、2 つのレコードのみが表示されます。
SELECT BT.NAME, BT.LOCATION
FROM SO_BUFFER_TABLE_7 BT,
(SELECT BT.NAME, BT.LOCATION, MAX(ROWID) AS UNQ
FROM SO_BUFFER_TABLE_7 BT
GROUP BY BT.NAME, BT.LOCATION
HAVING COUNT(*) > 1) A
WHERE BT.ROWID <> A.UNQ
AND BT.NAME = A.NAME
AND BT.LOCATION = A.LOCATION
結果は
1 user1 1
2 user1 1
3 user2 1
SELECT を DELETE に置き換えて、繰り返されるレコードを削除できます。
それが役に立てば幸い