0

テーブルをそれ自体の別のインスタンスと比較して重複を削除する方法について、SOに関するいくつかの投稿を読みましたが、比較したい重複を削除したくありません。

例えば。「id」、「sold_price」、「bruksareal」、「kommunenr」、「Gårdsnr」、「Bruksnr」、「Festenr」、「Seksjonsnr」のフィールドがあります。すべてのフィールドは int です。

重複/同一の行を特定したい (同じ bruksareal、kommunenr、gårdsnr、bruksnr、festenr、および seksjonsnr)。同一の場合、これらの行に一意の参照番号を付けたいと思います。

これにより、後で他のフィールドで比較したい行を特定しやすくなると思います(例:「sold_price」、「sold_date」など)。

私のアプローチが間違っていると思われる場合は、提案を受け付けています...

4

2 に答える 2

1

すべてのフィールドでテーブル自体に結合を実行し、次のexistsようなクエリを使用します。

Update Table1
Set reference = UUID()
Where exists (
 Select tb1.id
 from Table1 tb1 inner join Table1 tb2 on
  tb1.Field1 = tb2.Field1 AND
  tb1.Field2 = tb2.Field2 AND
  etc
 Where tb1.Id = Table1.Id
 And tb1.Id != tb2.Id
)

実際には、結合するだけで単純化できます

Update Table1
Set reference = UUID()
From Table1 inner join Table1 tb2 on
      Table1.Field1 = tb2.Field1 AND
      Table1.Field2 = tb2.Field2 AND
      etc
Where Table1.Id != tb2.Id
于 2012-12-27T11:10:04.070 に答える
0

あなたがそれをしたい場所に応じて、私はハッシュ実装に行きます。挿入ごとに、挿入を行うときに必要な列のハッシュを計算し(トリガーの可能性があります)、その後、重複している行を非常に簡単に見つけることができるはずです(その列にインデックスを付けると、クエリはかなり高速になります) 、ただし、これはまだint列ではないため、時間の経過とともに少し遅くなることに注意してください)。

この後、データベースで非常に高価なクエリを実行することなく、複製されたレコードを使用して好きなことを行うことができます。

後で編集:MD5などの一部のmysql関数は、オペランドがnullの場合にnullを返すだけなので、null値を定義済みの値に変換するようにしてください。concatについても同じことが言えます。1つのオペランドがnullの場合、nullを返します(ただし、concat_wsについては同じではありません)。

于 2012-12-27T16:08:28.143 に答える