こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ACCESSとORACLEで抽出結果が異なる

いつもお世話になっております。

ACCESS2000を扱っております。
ACCESSのデータベースにODBCを接続してORACLEの
テーブルをリンクテーブルとしてインポートします。
そして、ACCESSのテーブルとORACLEのテーブルを
LEFT JOIN を行いクエリーを作成したのですが、
正しい結果が抽出できません。
ただし、ORACLEのテーブル構成・データと全く同一の
ACCESSのテーブルを作成し、クエリーを作成したところ
正常に動作しております。

SQLは以下のような内容となっております。

sSQL = SELECT TBL_1.A, TBL_1.B, TBL_1.C
FROM TBL_1 LEFT JOIN TBL_2 ON
TBL_1.A = TBL_2.A AND
TBL_1.B = TBL_2.B AND
TBL_1.C = TBL_2.C
WHERE
TBL_2.A IS NULL AND
TBL_2.B IS NULL AND
TBL_2.C IS NULL

TBL_1がORACLEより引っ張ってきたリンクテーブル、
TBL_2がACCESSに存在するテーブルになります。
以上のSQLで、TBL_2に存在なくTBL_1に存在するレコード、及びTBL_1とTBL_2でキー項目は同じだが
内容が異なるレコードを抽出できると考えているのですが、TBL_2に存在なくTBL_1に存在するレコードしか
抽出できません。
個人的には、処理する件数が多大であることが影響しているのかとも考えているのですが・・・。
(両テーブルともに約20万件レコード)

クエリーを分割することで解決はしたのですが、
原因究明を求められておりまして大変困っています。
皆様の知恵を借りたいです。宜しくお願いいたします。

投稿日時 - 2005-06-15 19:46:42

QNo.1451507

すぐに回答ほしいです

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

抽出条件が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
;

投稿日時 - 2005-06-16 09:41:45

お礼

ご回答ありがとうございます。

試してみます。

投稿日時 - 2005-06-16 23:16:35

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

何がキー項目、どれが内容にあたる項目なのか区別できないので、
説明が理解できてないんですが..

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のような気がするのですが...

投稿日時 - 2005-06-16 00:28:28

お礼

ご返答ありがとうございます。

上記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の方がフィールドが多いという大変
ややこしいことになっているのです・・・。
(比較する項目のデータ型は一致。ただし、最大長は違う。。。。。)

投稿日時 - 2005-06-16 01:05:28

あなたにオススメの質問