- ベストアンサー
ACCESSとORACLEで抽出結果が異なる
- ACCESS2000を扱っております。ACCESSのデータベースにODBCを接続してORACLEのテーブルをリンクテーブルとしてインポートします。そして、ACCESSのテーブルとORACLEのテーブルをLEFT JOIN を行いクエリーを作成したのですが、正しい結果が抽出できません。
- ORACLEのテーブル構成・データと全く同一のACCESSのテーブルを作成し、クエリーを作成したところ正常に動作しております。
- クエリーを分割することで解決はしたのですが、原因究明を求められておりまして大変困っています。皆様の知恵を借りたいです。宜しくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
抽出条件が2つあるのであれば.. select * from tbl_1 left join tbl_2 on (tbl_1.a=TBL_2.a) where tbl_1.b<>tbl_2.b or tbl_1.c<>tbl_2cb or tbl_2.a is null がそれにあたるかと思います。 (質問に書かれたSQLの条件でも意味は同じになるハズですが..) ただ、今回の問い合わせは、外部結果が必要な訳ではなく 抽出条件にマッチするかのチェックのための結合なので、 外部結合を利用しなければいけない、ということはないので、 次のようなSQLで解決するのが良いかも知れません。(わかりやすい) select tbl_1.a,tbl_1.b,tbl_1.c from tbl_1 where not exists(select 1 from tbl_2 where tbl_1.a=tbl_2.a) union all select tbl_1.a,tbl_1.b,tbl_1.c from tbl_1 left join tbl_2 on tbl_1.a=tbl_2.a where tbl_1.b<>tbl_2.b or tbl_1.c<>tbl_2.c ;
その他の回答 (1)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
何がキー項目、どれが内容にあたる項目なのか区別できないので、 説明が理解できてないんですが.. TBL1のA,B,Cに完全一致するTBL2以外は連れてこない結合条件ですよね? で、WHEREに書いた条件が、TBL2を連れてこなかった(NULL)ものとしているので、 今のSQL文に対しては、当然の結果のように思えます。 select * from tbl_1 left join tbl_2 on (tbl_1.キー=TBL_2.キー) where tbl_1.内容<>tbl_2.内容 というようなSQLが説明に合致するSQLのような気がするのですが...
お礼
ご返答ありがとうございます。 上記SQL中でキーはA、 内容にあたる項目はB,Cになります。 抽出したいレコードは2種類あり、 (1)TBL1にあり、TBL2に存在しないレコード (2)TBL1とTBL2に同じキー項目を持ちながら、 内容が違うレコード を同時に取得するために、上記SQLを作成したものです。 私も最初このSQL文を見たとき(実は私が作成したSQLではないのです)、K_o_r_o_c_h_a_n様の書かれたとおり、WHERE句以降の条件がTBL2の項目 is nullとなっているので、(1)の条件に該当するレコードしか抽出されないものと考えていたのですが、実際にACCESS中でクエリーを発行すると上手くいくのです。 また、厄介なことにTBL_1とTBL_2のレイアウトが 異なり、TBL_2の方がフィールドが多いという大変 ややこしいことになっているのです・・・。 (比較する項目のデータ型は一致。ただし、最大長は違う。。。。。)
お礼
ご回答ありがとうございます。 試してみます。