いつもお世話になっております。
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万件レコード)
クエリーを分割することで解決はしたのですが、
原因究明を求められておりまして大変困っています。
皆様の知恵を借りたいです。宜しくお願いいたします。
No.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
;
No.1
- 回答日時:
何がキー項目、どれが内容にあたる項目なのか区別できないので、
説明が理解できてないんですが..
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の方がフィールドが多いという大変
ややこしいことになっているのです・・・。
(比較する項目のデータ型は一致。ただし、最大長は違う。。。。。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAチェックボックスで有効無効切り替えできるように 5 2022/10/21 16:13
- Visual Basic(VBA) フォーム上のリストボックスに重複して表示しています 3 2022/10/19 11:55
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
- Visual Basic(VBA) VBA チェックボックスの設定について 1 2022/10/24 10:27
- Visual Basic(VBA) VBAコードで質問があります 2 2022/10/20 15:27
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
- PHP PHPSpreadsheetを使って関数を繰り返し埋め込みたい 1 2023/05/24 11:33
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 4 2023/05/26 10:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECTで1件のみ取得するには?
-
PostgreSQLで小数点以下を処理...
-
ORDER BY 半角カナ
-
SQL>UPDATEと同時にその件数を...
-
Date型にNULLをセットしたい V...
-
sqlplusの処理が途中でとまる
-
SQL Server 2000でテーブル内容...
-
GROUP BYを行った後に結合した...
-
Accessで別テーブルの値をフォ...
-
select句副問い合わせ 値の個...
-
select insertで複数テーブルか...
-
JSPのNULLレコード表示について...
-
GROUP BYを使ったSELECT文の総...
-
Oracleでの文字列連結サイズの上限
-
ADO VBA 実行時エラー3021
-
複数行を1行にするSQL
-
MERGE文を単体テーブルに対して...
-
質問です。 下記のテーブルとデ...
-
DATE型にNULLをセットするには?
-
Excelで、改行がある場合の条件...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECTで1件のみ取得するには?
-
Date型にNULLをセットしたい V...
-
SQL>UPDATEと同時にその件数を...
-
oracleのinsert select性能
-
sqlplusの処理が途中でとまる
-
ACCESSのSQLの書き方
-
異なるDB間でのJOINやVIEWについて
-
プロシージャで変数をテーブル...
-
SELECTでの指定行からの指定行...
-
ORDER BY 半角カナ
-
☆☆☆☆SQL Olacle 3つ以上の文字...
-
AccessVBAでリンクテーブルの参...
-
ACCESSとORACLEで抽出結果が異なる
-
PostgreSQLで小数点以下を処理...
-
オラクル オブジェクトのデー...
-
正規化?の戻しについて
-
取得するデータの件数指定、MyS...
-
SQLで抽出可能でしょうか?
-
GROUP BYを行った後に結合した...
-
Accessで別テーブルの値をフォ...
おすすめ情報