• 締切済み

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

  • テーブル結合について、下記SQLをANSI結合の書き方で表したい。

    テーブル結合について、下記SQLをANSI結合の書き方で表したい。 select * from (select key from A union select key from B union select key from C) X, A,B,C where X.key=A.key(+) and X.key=B.key(+) and X.key=C.key(+) このSQLをANSI結合の記述で書きたいのですが、 (+)での結合文になれておらず試行錯誤しております。 下記のようなのかなとは模索しておりますが、 手元に実行環境がなくわかりません。 また、要所気付く点などありましたら、ご指摘願います。 select A.*, B.*, C.* from (select key from A union select key from B union select key from C) X, LEFT JOIN A ON X.key=A.key LEFT JOIN B ON X.key=B.key LEFT JOIN C ON X.key=C.key

  • 【至急】SQLの結合について教えてください。

    select * from A where ab = '1' and cd = '2' select ef from B where ab = '1' and cd = '2' and ef = '3' 至急質問させてください。 上記SQLを結合したいです。(Oracleです) 取得したいデータはAのテーブルの全項目で、 取得条件として、Bのテーブルの項目ef = '3' だったらという条件を加えたいです。 キー項目は両テーブルとも同じ(ab, cd)です。 どのようなSQLがスマートでしょうか。。 無知で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。

  • ACCESSのSQLの書き方

    ACCESSでのSQL文の書き方を教えてください。 テーブルtbl_Aとテーブルtbl_Bがあり, tbl_Aで得られた数値とtbl_Bで得られた数値を加えたものを結果として表示します。 どう書けばよろしいのでしょうか。どうしてもエラーになってしまいます。 イメージとしてはこんな感じです。 select (select ~~ from tbl_A where ~~)+(select ~~ from tbl_B where ~~) (もしoracleならば,「from dual」というのを最後に付けるんですが。)

  • 【至急】SQLの結合について教えてください(2)

    select * from A select ef from B where ef = '3' かつ、A.ab = B.ab and A.cd = B.cd 至急質問させてください。 上記SQLを結合したいです。 取得したいデータはAのテーブルの全項目で、 取得条件として、Aのテーブルのキー項目 = Bのテーブルのキー項目に、Bのテーブルの項目ef = '3' だったらという条件を加えたいです。 どのようなSQLがスマートでしょうか。。 無知で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。 ※キー項目の値は条件に指定できない(持っていない)ことがわかりました。 先ほどの質問にご回答下さった皆様、申し訳ございません。

  • SQL - 3つのキーに含まれないもの?

    いつもお世話になっております。 テーブルAと、テーブルA_WRKがあり、 テーブルA_WRKはテーブルAと同じレイアウトです。 2つのテーブルのキーは3つあります。 二つのテーブルをUNIONでくっつけて表示したいのですが、 テーブルA_WRKにあるデータと同じキーのテーブルAのデータは 検索対象からはずしたいのです。 これがキーが一つだったら Select * テーブルA_WRK Where キー項目1 = 条件 Union Select * テーブルA Where キー項目1 = 条件 And キー項目1 Not In (Select * テーブルA_WRK Where キー項目1 = 条件) で検索できると思うのですが、 3つキーがある場合にどう書いてよいかわかりません。 使用DBはSQLServer2000です。 宜しくご教授お願いいたしますm(__)m

  • オラクルで外部結合

    オラクル8iを使用しています。 テーブルを外部結合する場合のパフォーマンスについてお聞きしたいのですが、 下の二つのSQL文でパフォーマンスは変わってくるのでしょうか? (外部結合記号(+)を=の前後につけた場合) SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE A.項目1 = B.項目1(+); SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE B.項目1(+) = A.項目1;

  • ACCESS テーブルの結合

    お世話になります。 テーブルA(約20万レコード)、B(6レコード)があり、共通しているフィールドは以下の通りです。  ・受注日  ・製品コード  ・数量 AとBのテーブルの共通しているフィールドを条件無しで1つのテーブルとして見立てたいと思っておりますがうまくいきません。 SELECT A.製品コード, A.数量, A.受注日 FROM A UNION SELECT B.製品コード, B.数量, B.受注日 FROM B; 上記SQLでエラーにはならないのですが、レコード数が本来約20万レコードあるはずが、7万レコードしか抽出されません。 SELECT A.製品コード, A.数量, A.受注日 FROM A; と SELECT B.製品コード, B.数量, B.受注日 FROM B; をそれぞれ分けてやると、レコード数に問題ありません。。 どのようにすれば2つのテーブルを1つに結合できるのでしょうか。 ご教授の程、宜しくお願い致します。

  • SQL SERVER

    ORACLEの以下のようなテーブルの結合の構文を SQL SERVERでするとどのような構文になるのでしょうか? SELECT T1.T_CODE, T2.T_CODE, T2,F_NAME FROM TEST1 T1, TEST2 T2 WHERE T1.T_CODE = T2T_CODE(+)

  • テーブルのマージSQLに関して

    初歩的なSQLの質問で申し訳ありません。 以前にも同じような内容で投稿させて頂きましたが、教えて下さい。 下記のような、ある異なる名前の同項目を持つ2つのテーブルが存在します。 《テーブル》 Aテーブル   社員番号、日付、内容、所属、時間、結果 Bテーブル  社員番号、日付、内容、理由  ※ 内容に関しては、AテーブルとBテーブルで全く違います。 これらの2つのテーブルをマージさせ、社員番号毎の内容毎、日付順に したいと考えています。 以前に以下のようなUNIONを教えてもらいましたが、所属、時間、結果、理由という 項目全てを出力するとした場合、どのように記載すれば良いでしょうか? UNIONの場合、項目が異なるとエラーとなってしまうかと、、、 《UNIONのSQL》 SELECT * FROM ( SELECT 社員番号, 日付, 内容 FROM Aテーブル UNION SELECT 社員番号, 日付, 内容 FROM Bテーブル ) ORDER BY 日付, 社員番号, 内容 教えて下さい。 よろしくお願いします。

  • ACCESSのモジュールでのUNION

    ACCESS超初心者です。 モジュールでテーブルAとBテーブルBを結合しテーブルCを作成したいのですが、 DoCmd.RunSQL " SELECT * FROM TABLE_A UNION SELECT * FROM TABLE_B INTO TABLE_C; " でRunSQL実行時のエラー(2342)となってしまいます。 きっと基本的なことだと思うのですが・・・ どうぞお教えください。

専門家に質問してみよう