2つのACCESSファイルのテーブルを比較する方法

このQ&Aのポイント
  • ACCESSデータベースファイル1.accdbとACCESSデータベースファイル2.accdbの各テーブルを比較する方法についてまとめました。
  • 両者のファイルサイズは異なるが、テーブルの生成方法などによるものであり、バイナリ比較でも一致しない場合があります。
  • ACCESSの機能やVBAを利用してテーブルの一致確認を行うことができますが、他のツールや方法でも可能です。
回答を見る
  • ベストアンサー

2つのACCESSファイルのテーブルを比較する方法

ACCESSデータベースファイル1.accdbの各テーブル(データ)と ACCESSデータベースファイル2.accdbの各テーブル(データ)は 完全に一致するはずですが、 両者の各テーブル(複数あり)が一致するかどうかを簡単に 確認するにはどうすればよいでしょうか。 なお、テーブルの生成方法の違いか何かの理由で 両者のファイルサイズは一致していません。 また、バイナリ比較でも一致していません。 ACCESSの機能で確認できるのであればACCESSを使用した方法で、 ACCESSの機能だけでは難しければACCESSのVBAを利用した方法で、 それでも難しければ他のツールや方法でも構いません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • naoto0216
  • ベストアンサー率46% (183/391)
回答No.4

#2です。 >サイズが異なった場合には、 >実際のテーブルのデータのどこかが異なっている >と一般的に言えるのでしょうか? 失礼しました。勘違いしておりました。 ちなみに、それぞれのテーブルのレコード数は同じってことで よいんですかね(レコード数の違いだけなら不一致クエリですぐ 分かるハズなのでわざわざ質問しないはず)。 で、どこかのフィールドで異なった値が入ってるのではないか ・・・ってことを知りたいってことなんでしょうか。 VBAを使わないとなると、 ファイル1のテーブルA  ファイル2のテーブルA ID     ------------- ID フィールド1 ------------ フィールド1 フィールド2 ------------ フィールド2   ・           ・ フィールド10 ---------- フィールド10 っていうクエリAを作ります。 ※別のaccdbを作るか、ファイル1にファイル2のテーブルAを  リンクします。 例えばテーブルAのレコード数が1万レコードだったとして 全てのフィールドの内容が一致してたら、このクエリも 1万レコードになるはずです。どこかのフィールドに異なった 値が1つあれば、9999レコードになります。 で、このクエリAとファイル1のテーブルAとの不一致クエリ を作成します。 そうすれば、何レコード目に異なった値があるかは確認できます。 ※要するにファイル1のテーブルAにはあって、クエリAにはない  IDが分かる。 とはいっても、どのレコードかってのが分かるだけであり どのフィールドが異なっているかは上記だけでは把握できません。 フィールド数が少なければ、目視で比較してもよいかもしれませんが。。 とりあえずどのレコードか(どのIDか)さえ分かれば、そのID 限定でクエリを作って、比較すればよいかと思います。 それぞれのテーブルAをIDで紐付けて、上記で分かったIDを条件とし それぞれのフィールドが一致しているか比較すればよいかと思います。 SQLだと、 SELECT [テーブル1].ID, IIf([テーブル1]![フィールド1]=[テーブル2]![フィールド1],"○","×") AS フィールド1判定, IIf([テーブル1]![フィールド2]=[テーブル2]![フィールド2],"○","×") AS フィールド2判定・・・って感じです。 ※テーブル1がファイル1のテーブルA、テーブル2がファイル2のテーブルA 上記の方法はフィールド数が多く、比較するテーブル数も多いと 余計に手間がかかってしまいますので、ここまで書いてしまいましたが お勧めできないやり方です。

yam2012
質問者

補足

回答ありがとうございます。 >ちなみに、それぞれのテーブルのレコード数は >同じってことでよいんですかね はい。レコード数もフィールド数も同じです。 >どこかのフィールドで異なった値が入ってるのではないか >・・・ってことを知りたいってことなんでしょうか。 はい。すべてのフィールドの値が一致していることを 確認できればいいです。 >ファイル1のテーブルA  ファイル2のテーブルA > ID     ------------- ID >フィールド1 ------------ フィールド1 >フィールド2 ------------ フィールド2 >っていうクエリAを作ります。 は、 不一致クエリウィザードで作成したクエリに対して (ウィザード画面では1つのフィールドしか結線できないので) デザインビューで ID      -----------> ID フィールド1 -----------> フィールド1 フィールド2 -----------> フィールド2 というように結線すればよいのでしょうか。 これが正しいとして >このクエリAとファイル1のテーブルAとの >不一致クエリを作成します。 は、 不一致クエリウィザードで、 テーブルAと、 クエリのラジオボタンを選択して 先ほど結線したクエリAとを選択して 同様にウィザードを進めていけば よいのでしょうか。 >上記の方法はフィールド数が多く、 >比較するテーブル数も多いと >余計に手間がかかってしまいます 手で一から入力するのは大変なので 不一致クエリウィザードで生成した クエリ式をコピーして 修正するようにしています。 よろしくお願いします。

その他の回答 (11)

  • chie65535
  • ベストアンサー率43% (8522/19371)
回答No.1

>両者の各テーブル(複数あり)が一致するかどうかを簡単に >確認するにはどうすればよいでしょうか。 ・方法1 新しい「比較チェック用データベースファイル」である「3.accdb」を作成し、そのデータベースファイルから、各accdb内の全テーブルを「リンク」で参照して「クエリ」で1つづつ比較する。 ・方法2 各テーブルの内容を「ソートした状態でCSVファイルにエクスポート」して、1.accdbから抽出したCSVと、2.accdbから抽出したCSVを、テキスト比較する。 テーブルに入力されたデータが「完全一致」していれば「ソートしてCSV出力した結果」は「ファイルサイズもファイル内容も完全一致」する筈ですから「CSVをバイナリ比較」するか「CSVをFCコマンドで比較」すれば良いです。 >両者のファイルサイズは一致していません。 accdbファイルは「Microfoft Jet データベースエンジン」で作成されたファイルで、内部構造は「非常に複雑」になっています。 内部は、テーブルやクエリの作成日や更新日などが個別に記録されているなど「Windowsのファイルシステムに匹敵するほどの複雑さ」になっていて「内容が完全に同じ」であっても「ファイルサイズが一致する事は100%無い」ですし「バイナリ比較で一致する事は1000%無い」です。

yam2012
質問者

補足

ありがとうございます。 方法1の方法で確認してみました。 「リンク」は作成することができたのですが、 「クエリ」で比較するの部分で困っています。 よく分からないので、最初は、 「作成」タブの「クエリ」グループの「クエリデザイン」、 「デザイン」タブの「結果」グループの「表示▼」の 「SQL SQLビュー」で表示される画面で、 SELECT;を削除して、テーブルのフィールドを比較する SQLコードを手で入力していたのですが、フィールドや 括弧が多くてエラーが消せなくてかなり大変で、 その後、クエリウィザードがあるということを知って、 「作成」タブの「クエリ」グループの「クエリウィザード」の 「不一致クエリウィザード」で確認していたのですが、 実際には異なっているのに不一致レコードが検出されません。 このため、テスト的に小さなテーブルを作成して 確認してみたのですが、同様に、 不一致レコードが検出されませんでした。 具体的には、 1) 2つのaccdbファイルを作成してどちらにも   同じ以下のテーブル1を作成します。   ただし、(D/E)の部分は、一方のファイルではD、   もう一方のファイルではEにしておきます。   ---テーブル1----   ID フィールド1 フィールド2    1   A       B    2   C      (D/E)   ---------------- 2)「外部データ」タブの「インポートとリンク」グループの   「Access」の   「リンクテーブルを作成してソースデータにリンクする」で   2つのaccdbファイルのテーブル1のリンクを作成する。   この結果、ナビゲーションウインドウに、   「テーブル1」と「テーブル11」という名前の   リンクテーブルが表示されている。 3)「作成」タブの「クエリ」グループの「クエリウィザード」で   新しいクエリのウィザードが表示される 4)「不一致クエリウィザード」を選択して「OK」ボタン 5)「テーブル:テーブル1」を選択して「次へ」ボタン 6)「テーブル:テーブル11」を選択して「次へ」ボタン 7) 左右のボックスで同じIDを選択して中央の「<=>」ボタン   関連付けるフィールドのボックスに、   ID <=> IDと表示されている。   「次へ」ボタン 8)「>>」ボタンですべてのフィールドを選択して「次へ」ボタン 9) クエリを実行して結果を表示するが選択されている状態で   「完了」ボタン 10) 実行結果が表示されるが、   不一致レコードは1件も表示されていない。   ID    フィールド1 フィールド2   * (新規) 11) 念のため、このクエリ名のタブ上で   右クリック/SQLビューでSQLコードを表示する --------------------------- SELECT [テーブル1].ID, [テーブル1].[フィールド1], [テーブル1].[フィールド2] FROM テーブル1 LEFT JOIN テーブル11 ON [テーブル1].[ID] = [テーブル11].[ID] WHERE ((([テーブル11].ID) Is Null)); --------------------------- この最後の部分のWHERE ((([テーブル11].ID) Is Null))がよく分からない。 ここは、本来は、 WHERE ((([テーブル1].[フィールド1]) <> ([テーブル11].[フィールド1])) or (([テーブル1].[フィールド2]) <> ([テーブル11].[フィールド2]))) ではないかと思われるがなぜこのようになっているのかがよく分からない。 どこかに操作や設定の誤りがあるのでしょうか。 よろしくお願いします。

関連するQ&A

  • エクセルのデータをアクセスのテーブルに移動入力する

    エクセルのデータをアクセスのテーブルに移動入力するVBA フォルダAにおいて、a1.xlsxというファイルがあり、 そのsheet1のセル(a,1)=1 A1が1 とします その値をアクセスのデータベース(これもフォルダAにあります)  b.accdbのテーブル1の フィールド1に入力したいときの エクセルマクロのVBAを御教示いただけると助かります さらに続けて フォルダAにおいて、a2.xlsxというファイルがあり、 そのsheet1のセル(a,1)=2 A1が2 とします その値をアクセスのデータベース上記と同じ  b.accdbのテーブル1の フィールド1に追加で入力したいときの エクセルマクロのVBA 以上わかると助かります よろしくお願いします win10 office365

  • これはアクセスファイルが壊れたという事でしょうか?

    ファイルを開こうとしたら、 'Id'は、このテーブルのインデックスではありません。 'ParentIdName'は、このテーブルのインデックスではありません。 と言うメッセージが消しても消しても出ます。 30回くらい消したらファイルが閉じます。 何回やっても同じ動作です。 新規に、新規 Microsoft Access データベース.accdbを作り リンクテーブルをしようとしても、同じメッセージが出てリンクできません。 もう二度とこのファイルは開けないのでしょうか? アクセス2010です。

  • AccessとSqlServerのテーブルリンク

    Access2007とSqlServer2008を使用しています。 Accessで作成したテーブルを「データベースツール」-「データの移動」でSqlServerに移行してリンクする際、 (1)SqlServerに新規にデータベースを作成すると、リンクテーブルマネージャから見てもリンク先DBが正しく表示されますが、 (2)その後、その既存DBに同じAccess内の別のテーブルを、「データベースツール」-「データの移動」してリンクしたものは、リンクテーブルマネージャから見てもリンク先DBが ()となっており表示されていません。 ツールとしてSqlServer Management Studioを使っていますが、そこからでも(1)のテーブルは表示されていますが、(2)のテーブルは表示されません。 でもリンクはできているようなのです。 また、SqlServer Management Studioを使って、SqlServer内に新規テーブルを作成し、 それをAccessからリンクしようとしても、テーブルリンク一覧内に表示されない状態です。 (「外部データ」-「ODBCデータベース」…)にて SqlServerのファイルデータソースを表示しています) (2)のテーブルはSqlServer Management Studioから見ることができないため、更新・削除もできず困っています。 DB、テーブル、リンク方法等、何か問題があるのでしょうか? よろしくお願いします。

  • ACCESS 同時使用の場合のファイルの扱い

    現在ネットワーク上に、下記の3つのデータベースを作成いたしました。 「データ.accdb」・・・データ蓄積用(CMSで取り込んだデータ1件毎に対して「入力.accdb」から追加入力) 「入力.accdb」・・・「データ.accdb」にデータを入力用(「データ.accdb」へリンクテーブル) 「閲覧.accdb」・・・「データ.accdb」を閲覧用(「データ.accdb」へリンクテーブル) 「入力.accdb」と「閲覧.accdb」では、起動時のメニュー項目が異なるため、別々のデータベースしています。 運用開始の際に、ユーザーには「入力.accdb」または「閲覧.accdb」のどちらかを使用していただくのですが、ネットワーク上にある、この2つのデータベースを使用する方法として、ネットワーク上のデータベースへのショートカットを各PC(ディスクトップ)に作成して使って頂くのと、ネットワーク上のデータベースをコピーして、使用して頂くのでは、どちが良いのでしょうか。 ユーザーは多くて同時に利用は入力用は15名 閲覧用は、30名程度を予定しており、 環境は全員同じくWIN7のACCESS2010です。 アドバイス宜しくお願いいたします。 ※一度質問させて頂きましたタイトル・内容に不備があり、削除し再度質問させていただきました。

  • Access2007のファイル削除

    Access2007を参考書を手に独学しています。 データベースファイル(△△・・・△.accdb)を作成しましたが、削除する方法がわかりません。データベースファイルの削除方法を教えてください。 もう少し具体的に説明しますと・・・ 学習の過程でデータベースファイルを作ったのですが、都合が悪くなって削除したくなりました。しかしAccess2007ではExcelのようにメニューバーに「ファイル(F)」というメニューがありません。 そこでOSの機能を使って直接削除をしました。 ところが削除したにもかかわらずAccessの初期画面では「最近使用したデータベースを開く」という場所に削除したはずのデータベース名が表示されるではありませんか。 無論これをクリックしてもエラーになります。 これを削除する方法を教えてください。よろしくお願いします。

  • アクセス インポートかファイル形式を変えたい

    壊れたアクセスファイルの中身を 新規 Microsoft Access データベース.accdbにインポートするには? 今まで開けてたのに、いきなり開けなくなった、壊れたアクセスファイルがあります。 どうしても開けないので、 新規 Microsoft Access データベース.accdb を作りそこにインポートしようとしたら、 「データベースの形式を認識できません」 となり、インポートできません。 mdb形式なのが原因なのでしょうか? win7、オフィス2010ですが、いままでmdb形式で使えてましたが Windows Updateをしたら、使えなくなりました。 mdb形式が原因なら中身はそのままで壊れたファイルをaccdbに変えたいのですが どうすればいいですか? よろしくお願いします。

  • ACCESSのテーブルを削除した後のファイルサイズ

    ACCESS2002のテーブルをいくつか削除しました。削除後に「ファイル」「データベースプロパティ」でサイズを見ると削除前と変わりません。 データを削除すると当然サイズが小さくなると思ったのですが、変わりませんでした。 「ツール」「データベールユーティリティ」「最適化/修復」をするとサイズが小さくなりました。 WordやExcelなどと違って「最適化/修復」をしないとファイルサイズは小さくならないのでしょうか? また「最適化/修復」は具体的にどんな時に使うものでしょうか?

  • ACCESSでリンクテーブルを自動的に作る方法

    ACCESS2000のデータベースが2つあって、片方のキャンペーンテーブルが2ヵ月に1度くらい随時増えていくので、もう片方のデータベースにそれに応じてリンクテーブルを自動的に増やしていく仕組みを作りたいと思っております。どなたかACCESS+VBAで良い書き方をご存知の方いらっしゃいましたら教えてください。よろしくお願いします。

  • テーブルリンクは途切れてしまいますか?

    アクセスです。 test1.accdbのテーブルをtest2.accdbへテーブルリンクしているのですが 元ファイルのtest1.accdbのファイル名を「新test1.accdb」の様に、変更した場合、テーブルリンクは途切れてしまいますか? また一つ一つ付け直ししないとだめですか?

  • oracle 7.3のアクセス権限

    パスとユーザー名が書かれたテーブルがあったとして、 それが一致するものだけ、他のデータを閲覧できるようにしたいのです。 テーブル上のデータはみられたくあ 上手くviewやアクセス権限を操作してパスとユーザーを一致させる方法はないでしょうか? 接続方法はVBAからoo4oを用いています。オラクルのアカウントは一つです。 select countのみ許可とかできればいいのですが、それは無理でしょうか? データベース初心者ですが宜しくお願いします。

専門家に質問してみよう