• 締切済み

ACCESSのVBAのSQLを教えてください。

テーブル1とテーブル2があり、それをUNIONで結合して、リンクさせたOracleのテーブルキーと 結合し、Oracleのテーブルにないキーを検索したいのですが、うまく出来ません。 ACCESSのVBAで作りたいのですが・・どうかご教授願います。 構成  テーブル1   項目名  Key 顧客コード1   名前 テーブル2     項目名   Key 顧客コード1   Key 顧客コード2      名前 Oracleのテーブル  テーブルB     項目名  Key 管理コード  テーブル1の顧客コード1とテーブル2の顧客コード2をUNIONでまとめたものをA1としA1.顧客コードとします それとOracleのテーブルであるテーブルBの管理コードと結合して テーブルBにないA1の顧客コードを抽出するSQL文を作成したいと思います。 (管理コード,顧客コード1,顧客コード2は同じ属性、同じ桁数) SELECT A1.管理コード FROM ( SELECT T1.顧客コード1 as 顧客コード FROM テーブル1 T1 UNION SELECT T2.顧客コード2 as 顧客コード FROM テーブル2 T2 )A1, テーブルB WHERE A1.顧客コード = テーブルB.管理コード AND テーブルB.管理コード IS NULL; エラーにはなりませんが、実行結果は、管理コード 0件です。データ的には、テーブルB側にはテーブル1にはあるがテーブルB側にないデータはあります。

みんなの回答

  • akanekor
  • ベストアンサー率52% (102/194)
回答No.3

また、まちがえてるかもしれないけど (--; 一応クエリー書いてみました SELECT A1.管理コード FROM ( SELECT T1.顧客コード1 as 顧客コード FROM テーブル1 T1, テーブルB WHERE T1.顧客コード1 != テーブルB.管理コード UNION SELECT T2.顧客コード2 as 顧客コード FROM テーブル2 T2, テーブルB WHERE T2.顧客コード2 != テーブルB.管理コード )A1 WHERE A1.顧客コード IS NOT NULL; もしくは SELECT T1.顧客コード1 as 顧客コード FROM テーブル1 T1, テーブルB WHERE T1.顧客コード1 != テーブルB.管理コード AND T1.顧客コード1 IS NOT NULL UNION SELECT T2.顧客コード2 as 顧客コード FROM テーブル2 T2, テーブルB WHERE T2.顧客コード2 != テーブルB.管理コード AND T2.顧客コード2 IS NOT NULL;

  • akanekor
  • ベストアンサー率52% (102/194)
回答No.2

>クエリーはエラーが発生します 机上確認なので(=w=; かんべんして、、。 で、原因気づきました。 >>テーブルB.管理コード IS NULL; です。 これだと、データがNULLの場合のみになってしまいます。 NULL 以外の指定がしたい場合は IS NOT NULL に変えてください。 (--; なんで昨日気づかなかったんだろ、、。

NYAN99
質問者

お礼

実は、補足を書いている時、フト私もNULLに気が付いたんです。(不一致抽出はNULLが大事ですから) そしてさっそく手直しして動かした所、動きました。 きちんと理由も書いてくださり、理解も出来きありがとうございました。 お忙しいとこありがとうございました。

  • akanekor
  • ベストアンサー率52% (102/194)
回答No.1

ここの意味が分からないのだけど、 >データ的には、テーブルB側には >テーブル1にはあるがテーブルB側にないデータはあります。 まあ、、、無視して、、。(-w-; > テーブルBにないA1の顧客コードを抽出するSQL文 の意味だけで解釈するとSQLが誤りです。 ここが間違ってて、 >>>A1.顧客コード = テーブルB.管理コード を >>>A1.顧客コード != テーブルB.管理コード 後、UNION で  でっかいテーブル作ってから、selectで条件を行うより、 検索結果で絞ってから、UNION を行った方が、処理が早い(はず(==; )。 なので、 SELECT A1.管理コード FROM ( SELECT T1.顧客コード1 as 顧客コード FROM テーブル1 T1 WHERE T1.顧客コード1 != テーブルB.管理コード AND UNION SELECT T2.顧客コード2 as 顧客コード FROM テーブル2 T2 WHERE T2.顧客コード2 != テーブルB.管理コード )A1 WHERE A1.顧客コード IS NULL; DB無いから、試してないけど、こんな感じ。

NYAN99
質問者

補足

テーブル1には  コード 43092、41541があり テーブル2には  コード 21243、32501があり テーブルBには  コード 41541、21243があるとします テーブルB(Oracle)に存在しないテーブル1とテーブル2のコードを抽出したいわけです。 この場合、その該当コードは、テーブル1にはあるけどテーブルBに存在しない43092 テーブル2にはあるけどテーブルBに存在しない32501となり テーブルBの不足データは、43092、32501の2件を抽出するようにしたいのです。 まあこの足りないデータを見つけて、テーブルBに登録するという処理をしたいので・・・ でも教えて頂いたクエリーはエラーが発生します。From句にテーブルBがないからだと思うのですが・・ 10行目のAndもいらないですよね? でもそれを追加してエラーをなくしても0件になってしまいます。 だけど、一致しないものを抽出した後、UNION で  でっかいテーブル作ってから、selectで条件を行うより、 検索結果で絞ってから、UNION を行った方が、処理が早い(はず(==; )。 これは、勉強になりました。(^^ゞ じつはテーブルBはものすごくデータ数が多いものなのです。

関連するQ&A