質問
17の異なるテーブルから作成された〜4000レコードのAccess 2003テーブルがあります。これらのレコードの約半分は重複しています。一意の識別列(id、nameなど)はありません。テーブルが結合されたときに自動入力されたid列があります。これは、重複が完全に同一ではないことを意味します(ただし、この列は状況を簡単にする場合は削除できます)。
Access Find Duplicates Query Wizardを使用して、重複したレコードのリストを表示しますが、それらを削除することはできません(削除できない場合、このクエリは何に使用しますか?)。生成されたクエリを削除クエリに変換しようとしましたが、検出される行の数が変わります。手作業でSQLを変更しますが、それは私を少し超えており、7行の長さです。
重複を取り除く良い方法を知っている人はいますか?
解決
重複の検索クエリでレコードを削除できない理由は、基本的には集計クエリであり、見つかった重複の数をカウントし、カウントが1より大きい場合を返すためです
重複の検索に基づいて削除クエリを作成した場合、重複した値を持つすべての行が削除される可能性があることを考慮してください。重複の1つを除くすべてを削除します。
比較でID列を除いて、レコードの重複をすべて削除するようにしてください。これを行う最も簡単な方法は、すべての一意のテーブル作成クエリを作成することです。値(MyTableからDistinct Field1、Field2 ...を選択)IDフィールドのすべてのフィールド except の代わりに、aの結果を使用して、約2000レコードの新しいテーブルを作成します(半分は重複しています)。
次に、新しいテーブルにID列を作成し、更新クエリを使用してこのIDを元のテーブルの最初に一致するIDに更新します(これは DLookup 、これは、ドメインでCRITERIAがtrueである最初のEXPRESSION値を返す)。
DLookup()関数は1を返します さらに多くても単一のフィールドからの値 1つのレコードが 基準。レコードを満たさない場合 基準、またはドメインに含まれていない場合 レコード、DLookup()はNullを返します。
一意の値である他のすべてのフィールドに基づいて最初に一致するIDを識別するため、一致しないIDは重複に属します。 PK関係を逆にして、一意のフィールドのセットが与えられた場合に最初に一致するキーを識別します。その後、IDをPKに設定する必要があります。もちろん、これはIDに固有の意味がないことを前提としており、特定の重複行の特定のIDを、他の重複行に属するIDの上に保持する必要はありません。これは、ID列のデータに関心があるため、残りのすべての行で保持することを前提としています。それ以外の場合は、DLookupステップを無視して、ID以外のすべての列でSelect Distinctを実行します。
他のヒント
ID列を除くすべての列で選択を使用します。
SELECT DISTINCTROW Column1, Column2, Column3
INTO MYNEWTABLE
FROM TABLE
名前を入れ替えるだけです。
このソリューションは、重複のない新しいテーブルを提供します。
次の手順では、元のIDが保持され、1ステップで実行されます。
DELETE FROM table_with_duplicates
WHERE table_with_duplicates.id NOT IN
(SELECT max(id)
FROM table_with_duplicates
GROUP BY duplicated_field_1, duplicated_field_2, ...
)
これで、重複がなく、IDが保存された元のテーブルができました。 また、大規模なDELETEを試みる前に、必ずデータをバックアップすることを忘れないでください。
DELETE * FROM table_with_duplicates
WHERE table_with_duplicates.ID In
(SELECT max(ID)
FROM table_with_duplicates
GROUP BY [duplicated_field_1]
HAVING Count(*)>1
)
実際に見つかった非常に簡単な解決策には時間がかかりましたが、すべてのフィールドは完全な重複レコードのように同じであり、すべてのフィールドで1つのクエリを作成し、「Group BY」でソートします。したがって、重複は結合され、この情報を新しいテーブルに追加して、既存のテーブルと同じ名前に変更できます。プライマリキーフィールドがある場合、クエリでそれを無視しても、データを結合できます(プライマリフィールドのデータを気にしないと仮定)。この解決策に誰も言及していないのに5時間かかった理由がわかりません。思い付くために。 :)