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% (8516/19358)
回答No.12

>1つよく分からない現象が起きていたのですが 該当の症状に当たった事は無いですが「マイクロソフトならありそうなバグ」かも知れません。 「Accesssのクエリのソートを信じない」と言うのも「1つの手としてアリ」かも知れません。 クエリでソートせずに、直にテーブルをCSVファイルにエクスポートして、コマンドプロンプトのSORTコマンドを使って、出力したCSVファイルをソートする、と言う方法も試してみて下さい。 コマンドプロンプトでソートしての比較は、以下のようにします。 C:\TEMP>SORT テーブル1.CSV > テーブル1.SRT C:\TEMP>SORT テーブル11.CSV > テーブル11.SRT C:\TEMP>FC テーブル1.SRT テーブル11.SRT いちいちクエリを作るよりは、こっちの方が手っ取り早いかも知れません。

yam2012
質問者

お礼

テキストファイルに出力すると 改行コードが入っていたため、行が分割されていました。 改行コードを削除してからテキストファイルに出力して、その後、 教えていただきました方法でソートと比較することができました。 ありがとうございました。

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

補足が長文すぎて全て読んでません(笑 すみません。 >一部のレコードが抽出されています。 >(つまり一致していないレコードがあるのです) >そのうちの1つのレコードについて、 >両テーブルのこのレコードを調べても違いが見当たりません。 >つまり、一致しているはずなのに抽出されているのです。 結局、本チャンのテーブルで同じように試してみたら 一致してないレコードがいくつかあって、その内1つの レコードを両テーブルて見比べてみたけど、違いが無さそう ・・・ってことですかね。 それって目視で確認されたのでしょうか。 ※一見、違いが無さそうでもスペース有無や全角半角など  の違いがあったりします。 本チャンのテーブル2つをIDで紐付けて選択クエリを 作成します。 例えば、ID100が一致してなかったとしたら、IDの条件を 「100」として下さい。 次に、両テーブルのフィールド1の値が同じか否か 確認する為に、 フィールド1判定: IIf([テーブル1]![フィールド1]=[テーブル2]![フィールド1],"○","×") としますフィールド1の値が異なっていたら×となります。 もし○だったら、フィールド1に関しては差異が無いという ことで、上記の[フィールド1]の箇所を[フィールド2]に書き換えて、 フィールド2を比較して・・・感じで全てのフィールドを確認 してみてはどうでしょうか。 フィールド数が多いと面倒ですが そうすれば、とりあえずどのフィールドの値が異なっている かは分かります。

yam2012
質問者

お礼

まったく同じテーブルなのに 不一致と判定される原因が分かりました。 一致していなかったレコードの1つを 確認してみましたところ、IIF文が実行される以前に、 JOIN ONの条件式にマッチしていませんでした。 (○も×も表示されていませんでした) どのフィールドでマッチしていないのかを調べてみると、 ある特定のフィールドでマッチしていないことが 分かりました。このフィールドの値は どちらも数値型でNULLになっていました。 調べてみましたところ、NULL同士の比較は、 WHEREの条件式では一致と判定されるのに対して、 JOIN ONの条件式では不一致と判定されるようです。 NULLを具体的な数値(0など)に変更して確認してみると、 正しく判定されるようになりました。この結果、 回答No9の補足コメントの(1)(2)および(1)~(13) の2つの方法のいずれにおいても、本チャンの テーブルでもすべて一致するようになりました。 念のため、一方のテーブルの値を別の値に変更して 比較すると変更したレコードだけが不一致の レコードとして検出されました。 これで2つのACCESSファイルのテーブルを正しく 比較することができるようになりました。 いろいろ親切に教えて頂きまして ありがとうございました。

  • chie65535
  • ベストアンサー率43% (8516/19358)
回答No.10

>元の並び順でファイルが出力されてしまいます。 >並び替えをした並び順で「テキストファイル」を出力するには >どうすればよいのでしょうか。 全てのフィールドを「昇順」で並び替えするように指示した「並び替えだけを行なうクエリ」を作成して、それをエクスポートして下さい。 なお「フィールドは*を使わず、すべて指定」して下さい。 例えば、テーブルに項目が6つあったら SELECT フィールド1,フィールド2,フィールド3,フィールド4,フィールド5,フィールド6 FROM テーブル1 OEDER BY フィールド1,フィールド2,フィールド3,フィールド4,フィールド5,フィールド6; のようなクエリを作って、そのクエリの結果をエクスポートします。

yam2012
質問者

お礼

そうでした。この方法がありました。 これでソートが正しくできました。 ありがとうございました。 なお、この操作をしている最中に、 1つよく分からない現象が起きていたのですが、 もしこの理由が分かりましたら教えてください。 最初は全部のフィールドをOEDER BYに指定していて、 なぜかソートの結果が正しくありませんでした。 この原因を調べていて、 フィールド1,フィールド2,フィールド3,フィールド4の 4つのフィールドで1つのレコードが一意に決まるため、 OEDER BY フィールド1,フィールド2,フィールド3,フィールド4; でソートをすると正しい並び順でソートされます。 フィールド5,フィールド6をこの後に追加したとしても この並び順に変化はないと思われるのですが、 OEDER BY フィールド1,フィールド2,フィールド3,フィールド4,フィールド5,フィールド6; としてソートをすると、 フィールド4の並び順が逆転する現象が起きるのですが、 このようなことがありえますでしょうか。 よろしくお願いします。

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

>選択クエリウィサードの2ページ目の画面で >次へボタンをクリックすると、 >下記のダイアログが表示されて >ここから先に進められないのですが? ウィザードから作れないのであれば、デザインから やってみて下さい。そっちの方が簡単かも。 作成⇒クエリデザイン を開きます。 追加するテーブルはテーブル1、テーブル11 の 二つです。 で、前回回答したように各フィールドを紐付けします。 テーブル1    テーブル11 ID  ------------ID フィールド1-------フィールド1 フィールド2-------フィールド2 ※クエリデザインの画面上で、テーブル1のIDをドラッグしたまま  テーブル11のIDにひっぱれば紐付きます。 で、テーブル1のID、フィールド1、フィールド2を 表示させるようにして下さい(IDだけでもよいです)。 そうすると、ID1だけが抽出されると思います。 ※ID2はそれぞれのテーブルでフィールド2の値が異なるので  抽出されません。 まずはここまで出来るかやってみて下さい。

yam2012
質問者

補足

回答ありがとうございます。 >まずはここまで出来るかやってみて下さい。 ここまで出来ました。 一致しているレコード(ID=1)だけが抽出されました。 ---SQLコード--- SELECT [テーブル1].*, [テーブル11].* FROM テーブル1 INNER JOIN テーブル11 ON ([テーブル1].ID = [テーブル11].ID) AND ([テーブル1].[フィールド1] = [テーブル11].[フィールド1]) AND ([テーブル1].[フィールド2] = [テーブル11].[フィールド2]); --------------- 回答No.7の分かりやすい説明で、こちらも出来ました。 一致していないレコード(ID=2)だけが抽出されました。 (不一致のレコードが正しく抽出されている) ---SQLコード--- SELECT [テーブル1].ID, [テーブル1].[フィールド1], [テーブル1].[フィールド2], [クエリ1].[テーブル11].ID, [クエリ1].[テーブル11].[フィールド1], [クエリ1].[テーブル11].[フィールド2] FROM テーブル1 LEFT JOIN クエリ1 ON ([テーブル1].[フィールド2] = [クエリ1].[テーブル1].[フィールド2]) AND ([テーブル1].[フィールド1] = [クエリ1].[テーブル1].[フィールド1]) AND ([テーブル1].ID = [クエリ1].[テーブル1].ID) WHERE ((([クエリ1].[テーブル11].ID) Is Null)); --------------- 以上のことを整理すると、 2つのテーブルのレコード数、フィールド数が同じ場合は、 (1) まず、1つ目のテーブルに、2つのテーブルを、   全フィールドが等しい条件で内部結合する。   この結果、   全フィールドが一致しているレコードのみが抽出される。 (2) 次に、1つ目のテーブルに、先ほど内部結合したテーブルを、   全フィールドが等しい条件(*1)で左結合する。   この結果、一致していないレコードの2つ目のテーブルの   全フィールドの値はNullになっているので、   2つ目のテーブルのどれかのフィールドの値が   Nullのレコードを抽出すれば、   一致していないレコードのみが抽出される。   (*1)サンプルのテーブルではIDが一意なので     IDフィールドが等しい条件のみでも可 これで一見正しいように思えるのですが 今回のテスト用のテーブル1ではなく、 実際の大きなテーブルで確認してみると、 (accdbファイルをコピーして同じテーブルで確認) (1)で一部のレコードが抽出されていません。 (つまり一致していないレコードがあるようです) そのうちの1つのレコードについて、 両テーブルのこのレコードを調べても違いが見当たりません。 つまり、一致しているはずなのに抽出されていないようなのです。 実は、回答No5を頂いた時に、 >例に書かれているケースなら、 >フィールド2同士を紐付けなければなりません。 のようにしてみたら正しく検出されたので、 すべてのフィールド同士を紐付けて確認をしていたのですが、 今回とまったく同じ現象に陥っていました。 以下にこの時の具体的な手順を示しておきます。 回答No1の補足コメントの(1)~(8)の手順の後、 (9) クエリのデザインを編集するを選択して完了ボタン (10) デザインビューが表示されて、    テーブル1のIDとテーブル11のIDが--->で結線されている。 (11) 同様に、    テーブル1のフィールド1とテーブル11のフィールド1、    テーブル1のフィールド2とテーブル11のフィールド2    を各々--->で結線する。 (12) この時のSQL式は、 --------------------- SELECT [テーブル1].ID, [テーブル1].[フィールド1], [テーブル1].[フィールド2], [テーブル11].ID, [テーブル11].[フィールド1], [テーブル11].[フィールド2] FROM テーブル1 LEFT JOIN テーブル11 ON ([テーブル1].[フィールド2] = [テーブル11].[フィールド2]) AND ([テーブル1].[フィールド1] = [テーブル11].[フィールド1]) AND ([テーブル1].[ID] = [テーブル11].[ID]) WHERE ((([テーブル11].ID) Is Null)); ---------------------    となっている。 (13) 実行すると不一致のレコードが表示される。    (不一致のレコードが正しく抽出されている) 以上のことを整理すると、 テーブル1に、テーブル11を、 全フィールドが等しい条件で左結合する。 この結果、全フィールドが一致しているレコードの テーブル11の全フィールドはNullではない。 一方、少なくとも1つのフィールドが一致していない レコードのテーブル11の全フィールドはNullになっている。 テーブル11のIDがNullのレコードのみを抽出すれば、 一致していないレコードのみが抽出される。 これで一見正しいように思えるのですが、 今回のテスト用のテーブル1ではなく、 実際のテーブルで確認をしてみると (accdbファイルをコピーして同じテーブルで確認) 一部のレコードが抽出されています。 (つまり一致していないレコードがあるのです) そのうちの1つのレコードについて、 両テーブルのこのレコードを調べても違いが見当たりません。 つまり、一致しているはずなのに抽出されているのです。 これらの原因が分かりますでしょうか。 よろしくお願いします。

回答No.8

途中から失礼します。 例えばですが以下のような二つのテーブルがあったとします。 主キーはFF1フィールド。 テーブル名 T1         T1c FF1 FF2    FF3     FF1  FF2    FF3 1 いろは   2000/4/28   1  いろはん  2000/4/28 2 にほへと  2000/2/29   2  にほへと  2000/2/29 3 ちりぬるを 2000/1/1    3  ちりぬるを 1999/12/31 4 わかよ   2000/12/31   4  わかよん  2000/12/31 5 たれそ   2001/1/1    6  たれそ   2001/1/1 7 ん      双方の共通したFF1キーのチェックは SELECT FF1, Count(*) AS Imitation FROM (SELECT * FROM T1 UNION SELECT * FROM T1c) AS Q1 GROUP BY FF1 HAVING (Count(*)=2); で、 FF1 Imitation 1     2 3     2 4     2 となります。(仮に同一ならなにも返ってきません) どのフィールドが異なっているか・・・はご勘弁ください。 どちらか一方にしかないFF1は、 SELECT FF1, Count(*) AS Alone FROM (SELECT * FROM T1 UNION ALL SELECT * FROM T1c) AS Q1 GROUP BY FF1 HAVING (Count(*)=1); で、 FF1 Alone 5  1 6  1 7  1 どっちのテーブルに孤立したFF1があるか・・・では 上記クエリを、『Q孤立チェック』として SELECT 'T1' AS TableName,Q1.FF1 FROM Q孤立チェック Q1 INNER JOIN T1 ON Q1.FF1 = T1.FF1 UNION ALL SELECT 'T1c' AS TableName ,Q2.FF1 FROM Q孤立チェック Q2 INNER JOIN T1c ON Q2.FF1 = T1c.FF1; で、 TableName FF1 T1     5 T1     7 T1c    6 となります。 ご参考まで。

yam2012
質問者

お礼

フィールドかレコードの数が同じでない場合に こちらの方法で対処できそうです。 ありがとうございました。

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

続きを書いておきます。 先ほど作ったクエリのレコード数とテーブルのレコード数が 同じであれば、各フィールドの値も同じということになります。 違っていたら次に進みます。 先ほど作ったクエリとテーブルで不一致クエリを作成します。 画像のようにテーブルのIDとクエリのIDを紐付けて、結合プロパティは 「テーブルの全レコードとクエリの同じ結合フィールドのレコード だけを含める」とします。線が----→になるはずです。 で、クエリのIDはIs Nullとします。 これで、テーブルにあってクエリに無いIDが抽出されます。 ※要するにフィールドの値が異なっているIDが抽出されます。 IDが分かれば、それぞれのテーブルでこのIDのフィールドの値に 違いが無いかを確認することになります。

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

>は、 >不一致クエリウィザードで作成したクエリに対して >(ウィザード画面では1つのフィールドしか結線できないので) >デザインビューで >ID      -----------> ID >フィールド1 -----------> フィールド1 >フィールド2 -----------> フィールド2 >というように結線すればよいのでしょうか。 違います。 不一致クエリではなく、選択クエリです。 単純に両テーブルの各フィールドを紐付けるだけです。 結合プロパティは「両方のテーブルの結合フィールドが 同じ行だけを含める」にして下さい。 ※画像のようにして下さい。 で、このクエリがテーブルのレコード数と同じであれば 各フィールドの値も全く同じということになります。 もし違っていたら、どこかしらの値が等しくないと いうことになります。 前回の回答にも書いたように、テーブルが1万レコード あるのに、クエリでは9999レコードしかない場合は どこかの1レコードでどこかのフィールドの値が異なって いるということになります。 まずは、ここまで理解できますか?

yam2012
質問者

補足

>不一致クエリではなく、選択クエリです。 選択クエリウィサードの2ページ目の画面で 次へボタンをクリックすると、 下記のダイアログが表示されて ここから先に進められないのですが? 具体的には、 (回答No.1の補足コメントと同じように) 1) 2つのaccdbファイルを作成してどちらにも   同じ以下のテーブル1を作成します。   ただし、(D/E)の部分は、一方のファイルではD、   もう一方のファイルではEにしておきます。   ---テーブル1----   ID フィールド1 フィールド2    1   A       B    2   C      (D/E)   ---------------- 2) 別のaccdbファイルで、「外部データ」タブの  「インポートとリンク」グループの「Access」の   「リンクテーブルを作成してソースデータにリンクする」で   2つのaccdbファイルのテーブル1のリンクを作成する。   この結果、ナビゲーションウインドウに、  「テーブル1」と「テーブル11」という名前の   リンクテーブルが表示されている。 3)「作成」タブの「クエリ」グループの「クエリウィザード」で   新しいクエリのウィザードが表示される 4)「選択クエリウィザード」を選択して「OK」ボタン 5) テーブル/クエリのボックスの▼で  「テーブル:テーブル1」を選択して>>ボタンをクリックする。 6) テーブル/クエリのボックスの▼で  「テーブル:テーブル11」を選択して>>ボタンをクリックする。 7) 右側の「選択したフィールド」のボックスに、   テーブル1.ID   テーブル1.フィールド1   テーブル1.フィールド2   テーブル11.ID   テーブル11.フィールド1   テーブル11.フィールド2   の6つが表示されている。 8) 次へボタンをクリックすると   タイトルが「選択クエリウィザード」で、  「選択したフィールドのレコードソースにアクセスできません。テーブルと、そのテーブルを基にしたクエリのフィールドを選択した可能性があります。もしそうであれば、テーブルかクエリのどちらかのフィールドだけを選択してください。」   というメッセージのダイアログが表示されます。 (同じリンクテーブルを使っても、 回答No.1の補足コメントの不一致クエリウィサードでは このようなダイアログは表示されていません) よろしくお願いします。

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

#2です。 >この最後の部分のWHERE ((([テーブル11].ID) Is Null))がよく分からない。 テーブル1の全IDに対して、テーブル11にないIDを抽出する場合、 このようにします。要するに不一致クエリです。 例えば、 テーブル1  テーブル11  ID ---------→ ID  1       1  2       3  3 この場合、テーブル1のID全件に対して、テーブル11に存在 しないID=「WHERE ((([テーブル11].ID) Is Null))」で抽出される ので、結果、ID2が抽出されます。 >不一致レコードが検出されませんでした。 そりゃそうです。両テーブルともにIDは1、2存在しますから 不一致ではありません。 例に書かれているケースなら、フィールド2同士を紐付けなければ なりません。 ご参考まで。

  • chie65535
  • ベストアンサー率43% (8516/19358)
回答No.3

>「不一致クエリウィザード」で確認していたのですが、 不一致クエリウィザードは「2つのテーブルが同じかどうか」には使えません。 不一致クエリウィザードは「特定のフィールド1つ」しか比較しません。 7)の操作の部分で「ID」を選んだ場合「IDフィールドについて、テーブル1にあって、テーブル11にないレコード」のみを抽出し、他のフィールドは無視されます。 なので、クエリで比較する場合は ・「ID」など、ユニークなキーが1つは必要 ・ユニークなキーでテーブルを連結する必要がある ・ユニークなキーが「片方のテーブルにしかない物」をWHERE句で抽出する ・連結に用いないフィールドはWHERE句で不一致の物を抽出する という処理が必要になります。 もし、ユニークなキーが無い場合は、クエリでの比較は出来ません。 テーブルに「ID」「フィールド1」「フィールド2」の項目があった場合、以下のようなクエリが必要になります。 SELECT * FROM テーブル1 LEFT JOIN テーブル11 ON テーブル1.ID = テーブル11.ID WHERE (テーブル11.ID Is Null) OR (テーブル1.フィールド1<>[テーブル11].[フィールド1]) OR (テーブル1.フィールド2<>[テーブル11].[フィールド2]) UNION SELECT * FROM テーブル1 RIGHT JOIN テーブル11 ON テーブル1.ID = テーブル11.ID WHERE テーブル1.ID Is Null; このクエリは「テーブル1にあってテーブル11にない物」と「テーブル11にあってテーブル1にない物」と「テーブル1にもテーブル11にもあるけど、他のフィールドがもう一方のテーブルの内容と異なる物」を抽出しています。 このクエリは、以下のクエリ SELECT * FROM テーブル1 LEFT JOIN テーブル11 ON テーブル1.ID = テーブル11.ID WHERE テーブル11.ID Is Null UNION SELECT * FROM テーブル1 RIGHT JOIN テーブル11 ON テーブル1.ID = テーブル11.ID WHERE テーブル1.ID Is Null UNION SELECT * FROM テーブル1 INNER JOIN テーブル11 ON テーブル1.ID = テーブル11.ID WHERE (テーブル1.フィールド1<>[テーブル11].[フィールド1]) OR (テーブル1.フィールド2<>[テーブル11].[フィールド2]) の冗長な部分を削って短くした物です。 もうお判りかと思いますが、フィールドが何十個もあれば、比較するWHERE句が長大になり、場合によっては「クエリで抽出できない」可能性があります。 当方は「ソートした状態でCSVファイルにエクスポートして、テキストファイルで比較する方法」を強くお勧めします。

yam2012
質問者

補足

回答ありがとうございます。 >方法2 >各テーブルの内容を「ソートした状態でCSVファイルにエクスポート」 >して、1.accdbから抽出したCSVと、2.accdbから抽出したCSVを、 >テキスト比較する。 (1) テキストファイルに出力する時の   ソートの仕方がよく分からないのですが、   テーブルを表示して、ソートするフィールドを選択して、   「ホーム」タブの「並べ替えとフィルター」グループの昇順ボタンで   表示上はソートされます。   念のため、この状態でテーブルを保存しておきます。   この後、「外部データ」タブの「エクスポート」グループの   「テキストファイル」で、エクスポートのウィザードが表示されて、   この2ページ目のエクスポートフォーマットのサンプルのボックス   を見ると並び順が元の並び順で表示されています。   このまま進めると、このサンプルのボックスに表示されている   元の並び順でファイルが出力されてしまいます。   並び替えをした並び順で「テキストファイル」を出力するには   どうすればよいのでしょうか。または、   「テキストファイル」を出力する時にソートする設定が   どこかにあるのでしょうか。 (2) 3つ以上のキーでソートすることはできますでしょうか。 よろしくお願いします。

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

>なお、テーブルの生成方法の違いか何かの理由で >両者のファイルサイズは一致していません。 とりあえず、両accdbファイルで最適化を実施してみて サイズが同じになるか確認してみてはどうでしょうか。 ちなみにa.accdbをコピーしてb.accdbを作成しました。 コピーした直後は同じサイズですが、例えば、a.accdb内の テーブルのフィールド幅を少し広くしただけでも a.accdbの方がサイズが40KBほど大きくなりました。 で、a.accdbを最適化すると、またb.accdbと同じサイズに なりました。 ってことで、テーブルの内容が同じであっても、ちょっとした 操作でサイズが変わってしまうようです。

yam2012
質問者

補足

>とりあえず、両accdbファイルで最適化を実施してみて >サイズが同じになるか確認してみてはどうでしょうか。 最適化を実行した後の2つのaccdbファイルの サイズが同じになった場合には、 実際のテーブルのデータがすべて一致している とは一般的には言えないので、 別の方法で確認する必要があると思いますが、 サイズが異なった場合には、 実際のテーブルのデータのどこかが異なっている と一般的に言えるのでしょうか? サイズが異なっていても、 実際のテーブルのデータがすべて一致している場合も ありえるとなると、 最適化した後のファイルのサイズがどちらになっても、 一致しているのか一致していないのかが分からないので、 この確認をする意味がなくなってしまいますので・・・ よろしくお願いします。

関連する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のみ許可とかできればいいのですが、それは無理でしょうか? データベース初心者ですが宜しくお願いします。

専門家に質問してみよう