最初のステップは、重複する主キー値を持つ行を識別することで削除しないことを得る:
SELECT col1, col2, count(*)
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1
を
これは、テーブル内の重複PK値の各セットに対して1つの行を返します。この結果の最後の列は、特定のPK値の重複数です。
重複するPK値の数が少ない場合は、手動で個別に削除するのが最善の手順です。例えば:
set rowcount 1
delete from t1
where col1=1 and col2=1
行カウント値が所定のキー値の重複のN-1個であるべきです。
テーブルに重複するPK値のセットが多数ある場合は、それらを個別に削除するには時間がかかる可能性があります。この場合、次の手順を使用できます。
- まず、上記のGROUP BYクエリを実行して、重複PK値のセット数と各セットの重複カウントを確認します。
- 重複するキー値を保持テーブルに選択します。例:
SELECT col1, col2, col3=count(*)
INTO holdkey
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1
- 重複する行を保持テーブルに選択し、プロセス内の重複を排除します。たとえば:
SELECT DISTINCT t1.*
INTO holddups
FROM t1, holdkey
WHERE t1.col1 = holdkey.col1
AND t1.col2 = holdkey.col2
この時点で、holddupsテーブルはt1が、重複のPKを持っている場合しかし、これは事実ではありません、独特のPKを持っている必要があります。たとえば、
元のテーブルから重複する行を削除します。たとえば:
DELETE t1
FROM t1, holdkey
WHERE t1.col1 = holdkey.col1
AND t1.col2 = holdkey.col2
は、元のテーブル内の一意の行を入れてください。例:
INSERT t1 SELECT * FROM holddups
あなたは、次のクエリを使用して、一度にこれを行うことができます
構文エラーです。 – Nisa
@Nisa、このフィドルを見てください:http://sqlfiddle.com/#!9/f4cef0/1。すべての作業、多分エラーを再現するためにステップごとに完全なクエリを提供する?あるいは、より良いフィドル –