AccessのDISTINCTについてお探しですね。
広告
Accessで重複データをスッキリ削除!安全で確実な方法を解説
Microsoft Accessでデータベースを使っていると、外部データを取り込むときのミスや、うっかり同じデータを何度も入力してしまったりして、全く同じ内容のレコードが複数できてしまうことってありますよね。
こういった重複データがあると、集計結果がおかしくなったり、データ容量を無駄に使ってAccessの動きが遅くなったりと、いいことがありません。
そこでこの記事では、Accessのクエリ機能を使って、重複データを削除したり見えなくしたりして、きれいな一意(ユニーク)なリストを作る方法を、安全で確実な手順でじっくり解説していきます。
まずは準備!重複データを処理する前に知っておきたいこと
Accessで重複データを処理するとき、いきなり削除クエリを実行するのは絶対にNGです。
もし設定を間違えて必要なデータまで消してしまったら大変ですよね。
しかもAccessでは、一度クエリを実行してしまうと「元に戻す(アンドゥ)」ができないんです。
だからこそ、どんな作業を始める前にも、必ずデータベースファイル(.accdbや.mdbファイル)をコピーして、安全な場所にバックアップを保存しておきましょう。
これは絶対に省いちゃダメな大切な作業です。
バックアップができたら、次に考えるべきは「重複しているレコードの中から、どれを残してどれを削除するか」というルールです。
人間の目で見ると全部同じに見えても、コンピュータが自動で処理するには、各レコードを区別するための基準が必要なんです。
ここで役立つのが、各レコードに自動で振られる重複しない番号(オートナンバー型の主キー)や、データが作られた・更新された日時を記録したフィールドです。
もし今使っているテーブルに主キーや一意の識別子がない場合は、処理を正確に行うために、オートナンバー型の新しいフィールドを追加することをおすすめします。
たとえば、こんなルールを決めておくとスムーズです。
* 主キーの番号が一番小さい(最初に登録された)レコードを残す
* 主キーの番号が一番大きい(最後に登録された)レコードを残す
* 更新日時が一番新しいレコードを正しいデータとして残す
このように、一意のキーを使って「どのデータを残すか」をはっきり決めておくことが、Accessで安全に重複を削除して、信頼できるデータベースを作るための大事なポイントになります。
集計クエリで重複を隠して一意なリストを作る方法
元のテーブルからデータを実際に削除する必要がなくて、単に重複のない一意なリストを画面に表示したいだけなら、「集計クエリ」を使うのが一番簡単で安全です。
この方法なら元のテーブルのデータは一切削除されないので、もしクエリの設定を間違えてもデータが消える心配がありません。
見た目上だけ重複行を一つにまとめて表示できるので、とても手軽に一意なリストが作れます。
具体的な手順はこんな感じです。
まず、クエリデザインの画面を開いて、重複を取り除きたいテーブルを追加します。
次に、画面上のリボンメニューにある「集計」ボタン(Σマークのアイコン)をクリックすると、デザイングリッドに「集計」という行が表示されます。
そこに、一意なリストとして抽出したいフィールドを全部ドラッグ&ドロップで並べて、それぞれの集計行を「グループ化」に設定してください。
これで、内容が完全に一致するレコードがまとめられて、重複のないスッキリしたリストが出来上がります。
ちゃんと意図した通りの結果になっているか確認するために、オートナンバー型の主キーフィールドもグリッドに追加して、その集計行を「最小」か「最大」に設定してみましょう。
こうすると、重複してまとめられたデータの中から、どのレコードが代表として選ばれたのかが一目でわかります。
この集計クエリは、それ単体で使うこともできますし、後で説明する物理的な削除処理のときに「残すべきデータのリスト」としても使えるので、まずはこのステップで正しいリストが作れるかしっかり確認しておきましょう。
不一致クエリと削除クエリを組み合わせて不要なレコードを消す方法
データ容量を減らすために、データベースから重複レコードを完全に削除したい場合は、いくつかのクエリを段階的に組み合わせて処理していく必要があります。
さっきの「集計クエリ」で、「残すべきレコード」のリストは作れました。
次にやるべきことは、「削除対象となる不要なレコード」の主キーを特定する作業です。
ここで活躍するのが「不一致クエリ」です。
処理の流れはこんな感じになります。
* 元のテーブルと集計クエリを組み合わせた選択クエリ(不一致クエリ)を作る
* 両方を主キーで結合して、集計クエリ側に存在しない主キーを抽出条件(Is Null)で見つける
* 抽出された「削除対象の主キー」をもとに、削除用のリストを作る
* 削除クエリを実行して、元のテーブルから不要なレコードを削除する
不一致クエリを使うと、「元テーブルの全レコード」から「集計クエリに残っている正しいレコード」を引き算して、余った不要なレコードだけをピンポイントで見つけられるんです。
削除対象の主キーリストができたら、いよいよ削除クエリでデータを消します。
ただし、不一致クエリの結果を直接削除クエリに設定すると、「指定されたテーブルから削除できませんでした」というエラーが出ることがあります。
これを避けるには、不一致クエリの結果を「テーブル作成クエリ」で一時的な別テーブルとして保存しておくのが確実です。
その後、元のテーブルとこの一時テーブルを主キーで結合した「削除クエリ」を新しく作って実行すれば、重複した不要なレコードだけがきれいに削除されて、テーブルには一意なリストだけが残ります。
テーブル作成・追加クエリを使ったもっと簡単で安全な方法
ここまで不一致クエリと削除クエリを細かく組み合わせる方法を説明してきましたが、クエリの数が多くて「ちょっと複雑だな…」と感じた人もいるかもしれません。
もし、レコードに振られている番号(オートナンバーなどの主キー値)が変わっても業務上問題ないなら、テーブルそのものを一度作り直してしまう「データ再構築」の方法がとても便利です。
この方法は考え方がシンプルで、初心者の方でも直感的にわかりやすいのがメリットです。
データ再構築の手順はとてもシンプルです。
* 重複させたくない全項目をグループ化した「テーブル作成クエリ」を実行して、新しいテーブルを作る
* 元のテーブルの中身を「削除クエリ」で全部削除して、空っぽにする
* 作った新しいテーブルから、空になった元のテーブルに「追加クエリ」でデータを流し込む
最初のステップで作る新しいテーブルには、すでに集計クエリのグループ化機能で重複が完全に取り除かれた、きれいな一意のデータだけが入っています。
この時点で実質的に重複削除は完了しているんです。
「なんでわざわざ元のテーブルを空にしてからデータを戻すの?」と思うかもしれませんが、これには理由があります。
既存の入力フォームや印刷用のレポートなどが元のテーブル名に紐付いていることが多いからです。
テーブルそのものを削除してしまうとリンク切れでエラーになりますが、中身のレコードだけを消して新しいデータを入れ直す形なら、既存のシステムを壊さずにクリーンな状態にできるんです。
さらに、この一連の作業はAccessのマクロ機能を使えば簡単に自動化できます。
毎日のデータ取り込みで重複がよく発生するような環境なら、この再構築マクロをボタン一つで実行できるようにしておくと、作業効率が劇的に上がりますよ。
広告
