データベースの複写の記録は悪い。 それらを容認できない。 少なくとも、それらは紛らわしい分析を作り出す。 万一のことがあっても、それらは全くすべてを破壊する。 あなたの適用はおそらく動くが、発生させるすべては疑わしい。 それらおよびそれらを削除するためにまたはあなたの顧客がちょうど削除するかもしれないことを見つけなければならない!
当然、あなたが開発する適用は得から複写を行く防ぐ-背部のあなた自身を軽く打ちなさい。 但し、潜在的問題の複写の姿勢へのあなたの鋭敏な洞察力は遺産の塗布を受継げば助けなかったりまたは汚れたデータを輸入する必要がない。 よいニュースはマイクロソフトのSQLサーバーの重複した記録を見つけ、削除することが難題ではないことである。 但し、複写をちょうど構成するか何が定めることはこうかつである場合もある。
このブログのポストはTechRepublicのダウンロードのPDFのフォーマットでまた利用できる。
複写の定義
記録を削除し始める前に言葉複写が意味するものを決定する必要がある。 私達のほとんどは1つの記録のデータが複写としてコラムごとの別のコラムに(を含むまたは基本キーを除く)一致させる記録を定義し。 議論はすべてのコラムからのちょうど少数に焦点を狭くすると同時により複雑になる。
ほとんどの場合反復的なデータが複写を作成するもの、ビジネスルールおよび反復的ではない価値は、定める。 定義は絶対ではないし、あなたのデータを知っていることはキーである。 それは銀製の弾丸がないことを意味する。 Aのリストの解決は一般的である; あなたの状態に合うためにそれを調節しなければならない。
Aのリスト
選びなさい* | テーブルからの削除
uniquefield一方、
(選り抜きuniquefield
テーブルから
ところ存在している(
0を選びなさい
tmptableテーブルから
table.field1 = tmptable.field1一方、
[およびtable.field2 = tmptable.field2
[および…]]
持っているtable.uniquefield >分(tmptable.uniquefield)
)
)
Aのリストをあなたが更新しなければならない変数台に置きなさい。
Aを台に置きなさい:
|
可変的 |
目的 |
テーブル |
あなたが重複した記録を削除しているテーブル。 |
uniquefield |
各記録を区別するコラム。 これは基本キーまたはアイデンティティのコラムのどれである場合もある。 |
tmptable |
subqueryによって作成されるテーブルのための別名。 |
field1、field2 |
複写から成り立つコラム。 |
選り抜きブランクのsubqueryはテーブルのテーブルそしてaliasedコピーの重複したコラムが一致する記録を取り出す。 uniquefieldの価値が他の列のための最小値より大きいそれらの列だけ戻るように節のそれ以上のフィルターを持っていることそれらの列。
元の記録として最小値について考えることができるが実際に重要ではない。 コードはアンカーとしてそれを使用する-それは一致の記録の入力順にもかかわらず、始まるべき場所単にである。 2つのsubqueriesは各々の元の記録のための重複した記録を戻す。 テーブルからそれらの記録を削除するために削除の声明を動かしなさい。 削除の後に、最低のuniquefieldの価値の記録だけテーブルに残る。
実際に記録を削除する前に選り抜き第1動かし、結果を検査しなさい。 単一のコラムを比較すればそして節任意がある。 各々の付加的なコラムのために重複した比較に加える、および節を加えなければならない。 のコラムの参照を更新することをところで節それに応じて忘れないでいなさい。
速い例
図Aのテーブルは少数の重複した記録を含んでいる。 具体的には、3つの記録は同じ郵便番号の価値を繰り返す。 2つの記録は同じ郵便番号および都市価値を繰り返す。
Aを計算しなさい
このテーブルは重複した記録を含んでいる。
このテーブルに対して図Bで示されている選り抜き声明を動かすことは2つの記録を戻す。 uniqueidentifier - CodeID、この場合-ところで3回行われるが、声明のリターンがそのコラムの最小値より大きいそれらの記録だけある1つの郵便番号の価値。 節が郵便番号および都市コラムを両方比較すると何が起こるか図Cは示し。 価値が両方とも重複しているたった1つの記録がある。
図B
選り抜き声明のリターン2つの重複した記録。
図C
比較を拡大することは重複した記録の数を減らす。
このアプローチが簡単な間、いくつかの事を考慮したいと思う:
- 平均が使用それ参照をいつも更新しなければならないこの声明は動的ではない。 異なったテーブルで複写を規則的に削除すれば、別のアプローチを見つけたいと思うかもしれない。 同じテーブルに対してそれを規則的に動かしたら、保存された手順にそれを変えることを考慮しなさい。
- テーブルの不快な削除記録し、撮り、コピーをそしてしばらくしがみつけばなら。 または、記録を全然削除してはいけない。 その代り、それらをアーカイブのテーブルに動かすか、または原表で削除されるように印を付けなさい。 いずれにしても現行プロセスからの記録をろ過し、歴史観を維持することを許可する。
- この解決は単一のテーブルで動作する。 関連のテーブルの価値に基づいて記録を削除すればずっと多くによりちょうど重複した価値を考慮する必要がある。
- uniquefieldがアイデンティティのコラムなら、欠測値を心配する必要がない。 コードはうまく働く。 記録はどんな特定の順序でもあるなる。
複写およびあなたの仕事を減らしなさい
重複した記録を信頼できる見つけるためのこの解決を見つける。 それが一時表およびカーソルを要求しないので実行することは容易である。 さらに、簡単なコードはすぐに更新することができる。
スーザンの販売Harkinsはデータベース技術の複数の記事そして本の独立したコンサルタントそして著者である。 彼女の最新の本は「Sybexが出版するマイクGunderloyと」、明白なマイクロソフトSQLサーバー2005を習得している。 マイクGunderloyとの他の共同は「VBAのマイクロソフトのアクセス2003年を」、「マイクロソフト・オフィスシステム2003年へのUpgraderガイド」、の「ICDL検査詰め込むマイクロソフトのアクセスへの2つ」、のおよび「絶対初心者のガイドをQueによる2003 ″すべて自動化している。 現在、スーザンはhttp://www.databaseadvisors.comでデータベースの顧問のための出版物ディレクターとして自ら申し出る。 ssharkins@gmail.comで彼女に達することができる。



