1

重複する行をすべて削除する必要があります。

t1
--------------------
col1    col2    col3
1       a       b
2       a       c
3       a       b

この例では、1 と 3 が重複しています。両方を別のテーブルに挿入してから、現在のテーブルから両方を削除する必要があります。

t1
--------------------
col1    col2    col3
1       a       c

t2
--------------------
col1    col2    col3
1       a       b
2       a       b

これを行う最善の方法は何ですか?

編集

もっと情報を提供する必要があります。t1 は、インポート用の行を含む一時テーブルです。レコードを一意に識別する 4 つのフィールドと、行ごとに追加の 20 以上のフィールドがあります。重複がある場合は、確認のために別のテーブルに挿入する必要があります。したがって、一時テーブルの値がシステムに挿入されると、ID 値が役に立たなくなるため、ID 値を保持する必要はないと思います。

4

5 に答える 5

0

次のコードは、重複レコードを削除するのに役立ちます。テーブルには、重複レコードを識別するために使用される ID 列が必要です。例のテーブルには ID 列として ID があり、重複データを持つ列は DuplicateColumn1、DuplicateColumn2、DuplicateColumn3 です。

DELETE
FROM MyTable
WHERE ID NOT IN
(
SELECT MAX(ID)
FROM MyTable
GROUP BY DuplicateColumn1, DuplicateColumn2, DuplicateColumn3)

引用元: http://blog.sqlauthority.com/2007/03/01/sql-server-delete-duplicate-records-rows/

于 2012-05-24T16:20:52.763 に答える
0
INSERT INTO T2(Col2, Col3)
SELECT Col2, Col3
FROM T1
WHERE EXISTS (  SELECT * 
                FROM T1 AS T 
                WHERE   T.Col2 = T1.Col2
                    AND T.Col3 = T1.Col3
                    AND T.Col1 <> T1.Col1
            )

DELETE FROM T1 
WHERE EXISTS (  SELECT * 
                FROM T2 
                WHERE   T2.Col2 = T1.Col2
                    AND T2.Col3 = T1.Col3
            )
于 2012-05-24T18:16:26.970 に答える
0
Select * into temp(temporary table) 
 from tablename 
       group by column_name1,column_name2 
         having (count(*)>=1)

--- データは重複なしで一時テーブルに挿入されます

drop tablename

select * into Tablename from temp
于 2013-11-11T07:01:37.600 に答える
0

すべての重複行を見つける 1 つの方法は、次のように、重複データを持つ可能性のあるすべての列でテーブルをそれ自体に結合し、col1 値が同一である行を除外することです。

select distinct a.col1
from t1 a inner join t1 b on a.col2 = b.col2 and a.col3 = b.col3
where a.col1 <> b.col1

これを使用して、t1 から t2 に挿入します (質問に対する私のコメントによると、t1 の col1 値を t2 に保持したい場合):

insert into t2 (col1, col2, col3)
select col1, col2, col3
from t1
where col1 in (
    select distinct a.col1
    from t1 a inner join t1 b on a.col2 = b.col2 and a.col3 = b.col3
    where a.col1 <> b.col1
)

次に、t1 からの削除:

delete t1
where col1 in (
    select distinct a.col1
    from t1 a inner join t1 b on a.col2 = b.col2 and a.col3 = b.col3
    where a.col1 <> b.col1
)

これは、一時テーブルを使用して col1 値を保持することで簡単になり、自己結合を 2 回行う必要がなくなります。一時テーブルを使用する方が安全です。それぞれ自己結合を行う 2 つの別個のクエリを使用すると、t2 に行を挿入せずに t1 から行を削除することが (リモートで) 可能です (つまり、t2 への挿入と t1 からの削除の間に新しい重複が t1 に書き込まれる場合、 t1 に新しく挿入された行は、2 番目の自己結合で一致します)。

また、削除の場合、t1 で再び自己結合を行う代わりに t2 を使用できます (ここでも、私の仮定が正しく、t2 に col1 値を保存している場合)。

于 2012-05-24T16:56:48.853 に答える
0

動作しました。

すべての重複レコードを t2 に挿入します。

insert into t2
select src.col2, src.col3 from t1 src
inner join (select t1.col2, t1.col3 from t1
            group by t1.col2, t1.col3
            having count(*) > 1) duplicates 
on src.col2 = duplicates.col2 and src.col3 = duplicates.col3

t1 から重複を削除します。

delete from t1
where t1.col1 in (
    select src.col1 from t1 src
        inner join (
                    select t1.col2, t1.col3 from t1
                    group by t1.col2, t1.col3
                    having count(*) > 1) duplicates
                    on src.col2 = duplicates.col2 and src.col3 = duplicates.col3
                   )
)
于 2012-05-25T16:11:30.893 に答える