3

複合主キー(a、b)を持つテーブルがあります。一時テーブルでバックアップを取りましたが、重複したレコードが発生しました。現在、バックアップ レコードをメイン テーブルに移動できません。

2 つの列に基づいて一時テーブルの重複を削除する方法をお勧めします。テーブルは oracle テーブルで、約 400 万の重複レコードが 7,000 万件あります

4

3 に答える 3

2

次の 2 つのオプションがあります。

  1. それらをコピーする前に、ソーステーブルの重複を削除してください
  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;

別の方法として (たとえば、一部の列がCLOBorとして定義されて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)
于 2012-05-09T14:07:27.017 に答える
1
  1. orafaqにリストされている3つの方法があります

  2. 重複レコードを排除する最も簡単な方法は、一時テーブルに SELECT DISTINCT を実行し、元のテーブルを切り捨てて、レコードを元のテーブルに戻すことです。詳細はこちら

  3. これはMSSQLサーバー用ですが、あなたの場合にも同じ原則が当てはまると思います.

于 2012-05-09T14:15:17.487 に答える
0

次のようなデータがあるとします


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 に置き換えて、繰り返されるレコードを削除できます。

それが役に立てば幸い

于 2012-05-10T08:49:21.230 に答える