プロが教える店舗&オフィスのセキュリティ対策術

アクセステーブル2つのデータ比較について質問があります、
宜しくお願いいたします。
Access, Excel, VBは初心者レベルです。
TableA,TableBというフォーマットが同じなテーブルがあり、
データが同じかを比較をし、どちらかのテーブルにないエントリーが
ある場合はそれを出したいと思います。
途中まで出来たのですが、uniqueではないデータがある為に正確な情報がでません。
具体的には:

TableA        | TableB
Field1 Field2 | Field1 Field2
AAA 10 | AAA 10
BBB 100 | BBB 100
CCC 200 | CCC 200
CCC 200 | EEE 100
DDD 100 |

希望の答えは
Field1 Field2 Field3
CCC 200 NotInB <--- これがでません
DDD 100   NotInB  <--- これはだせました
EEE 100 NotInA  <--- これもだせました

以下のようなものを書いたのですが、CCCのエントリーがTableBに
一件あるので件数が違うにもかかわらずひけませんでした。

SELECT TableA.*, "NotInB" as Field3
FROM TableA LEFT JOIN TableB ON (TableA.Field1=TableB.Field1) AND (TableA.Field2=TableB.Field2)
WHERE TableB.Field1 Is Null;
UNION ALL
SELECT TableA.*, "NotInB" as Field3
FROM TableA RIGHT JOIN TableB ON (TableA.Field1=TableB.Field1) AND (TableA.Field2=TableB.Field2)
WHERE TableA.Field1 Is Null;

一致したらフラグを立てて、再チェックしないようにすればいいのだと思うのですが、アクセスのクエリ、VBなどでどのようにすればできますか? 
もしくはアクセスからxlsなどに落としてから、ファイルの状態で比較
(会社で使うので外部ソフト等が使えません)
をVBでするといった方法を検討した方がいいのでしょうか?
色々調べてみたのですが、どっちもやり方が分からないので、
それはそもそも出来ないよなどの
アドバイスもございましたら、どうぞ宜しくお願いいたします。

A 回答 (2件)

uniqueでないデータ同士の比較はかなり難しい事だと思います。


まずuniqueにしてからの方が良いのではないでしょうか。

と言うことで以下のSQLを考えてみました。

SELECT TableA.Field1, TableA.Field2, Count(*) AS KensuA
FROM TableA
GROUP BY TableA.Field1, TableA.Field2
UNION ALL
( SELECT TableB.Field1, TableB.Field2, Count(*)*-1 AS KensuB
FROM TableB
GROUP BY TableB.Field1, TableB.Field2 )

これでField1とField2の組み合わせでuniqueにしたものを合わせています。ただ、Bの方の件数はマイナスにしていますので、このSQLの結果
をさらに件数で集計するとプラスはAのみに存在し、マイナスはBのみ
に存在、ゼロは一致になります。

上記のSQLをユニオンクエリ(名前をクエリAB)として保存し、集計した結果が以下のSQLです。

SELECT クエリAB.Field1, クエリAB.Field2, Sum(クエリAB.KensuA) AS KensuAの合計
FROM クエリAB
GROUP BY クエリAB.Field1, クエリAB.Field2;

何らかの参考になれば良いのですが・・・
    • good
    • 0
この回答へのお礼

keirikaさん、お返事が送れてしまい申し訳ございません。
SQLまで書いて頂いてありがとうございます、とても勉強になります。
自分の飲み込みが悪くて大変遅いですが、皆さんのアドバイスのおかげで前に進んでいます。
ご回答有難うございました。

お礼日時:2008/07/15 09:57

tab1:



ID_Field1_Field2
_1_AAA________10
_2_BBB_______100
_3_CCC_______200
_4_CCC_______200
_5_DDD_______100

tab1:

ID_Field1_Field2
_1_AAA________10
_2_BBB_______100
_3_CCC_______200
_4_EEE_______100

クエリ1:

ID_Field1_Field2_Field3
_1_AAA________10______0
_2_BBB_______100______0
_3_CCC_______200______0
_4_CCC_______200______0 <--- 1 にならない!
_5_DDD_______100______1

クエリ2:

ID_Field1_Field2_Field3
_1_AAA________10______0
_2_BBB_______100______0
_3_CCC_______200______0
_4_EEE_______100______2

問題は、

_4_CCC_______200______0 <--- 1 にならない!

ですね。

さて、上記の例では

ID_Field1_Field2_Field3_Fileld4
_1_AAA________10______1______0
_2_BBB_______100______1______0
_3_CCC_______200______1______0
_4_CCC_______200______2______1 <--- 1 に!
_5_DDD_______100______1______1

<同じデータの何番目か?>を意味するField3を生成すれば解決できます。

※で、これが可能なテーブル設計でしょうか?
    • good
    • 0
この回答へのお礼

Husky2007さん、
お返事が遅れてしまい申し訳ございません。
頂いたアドバイス通り、新しいフィールドの追加作業にかかっています。
まだちゃんと動いていない状態ですが、なんとか前に進めそうです!
本当に有難うございました。

お礼日時:2008/07/15 09:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!