2009-02-27 6 views

答えて

8

まあ、いくつかの点で、あなたはすべての列をチェックする必要があるとしている - なども参加するかもしれません...

それを行う必要があります
DELETE a 
FROM a -- first table 
INNER JOIN b -- second table 
     ON b.ID = a.ID 
     AND b.Name = a.Name 
     AND b.Foo = a.Foo 
     AND b.Bar = a.Bar 

...これがCHECKSUM(*)でもあるが、 のみがに役立ちます。実際の値をチェックして、ハッシュ衝突を防止する必要があります。

+5

これがある限り、列のどれもヌルを含まないようにうまく動作します。それが起こるとすぐに、null可能な列ごとに(a.Name = b.Name OR(a.Name IS NULLとb.Name IS NULL))のような複雑な条件を混乱させる必要があります。 nullを避ける別の理由。 –

+0

@Marc Gravell、テーブル 'a'とテーブル' b'が 'view'にあります。次に、重複した行を削除して元の状態にしておくことはできますか?私はそのようなページに[http://stackoverflow.com/questions/32065340/sql-server-2008-r2-delete-duplicate-rows-from-tables-containing-in-view/32065972?noredirect=1#comment52032907_32065972]を掲載しました状況。 – MAK

+0

これらの操作のINTERSECTとEXCEPT(他の回答を参照)を使用すると、NULLの問題を回避できます。http://sqlblog.com/blogs/paul_white/archive/2011/06/22/undocumented-query-plans-equality-comparisons.aspx – ryascl

1

私はクリスのINTERSECTポストはしかしはるかにエレガントであると私は将来的には代わりの外部結合の基準のすべてを書き出すことを使用します

DELETE FirstTable, SecondTable 
FROM FirstTable 
FULL OUTER JOIN SecondTable 
ON FirstTable.Field1 = SecondTable.Field1 
... continue for all fields 
WHERE FirstTable.Field1 IS NOT NULL 
AND SecondTable.Field1 IS NOT NULL 

...以下の擬似コードは、それを行うだろうと思います:)

0

私はDISTINCTクエリを試み、2つのテーブルの和集合を作成します。

asp/phpのようなスクリプト言語を使用して、一連の挿入ステートメントに出力をフォーマットし、結果のユニークデータを再構築することができます。

8

あなたはSQL Server 2005を使用している場合は、intersectを使用することができます。

delete * from table1 intersect select * from table2 
0

はこれを試してみてください。

DELETE t1 FROM t1 INNER JOIN t2 ON t1.name = t2.name WHERE t1.id = t2.id 
関連する問題