- ベストアンサー
ACCESSクエリでの結合の方法
- ACCESS 2003を使用している場合、3つのテーブルを結合する方法について教えてください。
- テーブルAのフィールドXとテーブルCのフィールドX、テーブルBのフィールドXとテーブルCのフィールドXを結合することで、3つのテーブルに共通するデータのみ抽出することができます。
- しかし、テーブルAとテーブルBの不一致データも一緒に抽出したい場合、どのようにすればよいでしょうか?お教えいただけますと助かります。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>実際には、TCのフィールドデータだけでなく、TAとTBの一部のフィールドデータも表示させたかったので、 >以下のようにセレクトしたいぶんを記述すればいいわけですね? >SELECT TA.フィールドA1, TB.フィールドB1, TC.フィールドC1, TC.フィールドC2, TC.フィールドC3・・・ >FROM テーブルA AS TA,テーブルB AS TB,テーブルC AS TC >WHERE TC.フィールドC1 = TA.フィールドA1 > OR TC.フィールドC1 = TB.フィールドB1 正解です
その他の回答 (6)
- Dxak
- ベストアンサー率34% (510/1465)
#1です > 結果、抽出データは無しでした。 う~ん?日本語的に私の方が読み取れてないのかな? 具体的な話・・・ テーブルA フィールドA1 a b c d テーブルB フィールドB1 b e f テーブルC フィールドC1 d g h と、した場合 結果、欲しいのは? 私の想定では、 a c が、出てくる結果を想定していたのですけど?
補足
お手数おかけしています。 欲しいデータは、 テーブルAフィールドA1とテーブルCフィールドC1をぶつけて 一致するデータおよび不一致するデータ と テーブルBフィールドB1とテーブルCフィールドC1をぶつけて 一致するデータおよび不一致するデータ です。 これらを一回のクエリ実行で実現させたいわけです。 一致したデータはフィールドに存在し、不一致でデータが存在しないフィールドは空白になっている状態で、クエリ結果として出したいのです。 テーブルA フィールドA1 a b c d テーブルB フィールドB1 b e f テーブルC フィールドC1 d g h と、した場合 欲しいのは結果は、以下のような感じのクエリ結果です。 テA:フィA1|テB:フィB1|テC:フィC1 a |(空) |(空) b |b |(空) c |(空) |(空) d |(空) |d (空) |e |(空) (空) |f |(空) (空) |(空) |g (空) |(空) |h
- pkh4989
- ベストアンサー率62% (162/260)
No3 です。 実は、以下の書き方なのですが、 SELECT テーブルC.* FROM テーブルA, テーブルB, テーブルC WHERE テーブルC.フィールドC1 = テーブルA.フィールドA1 OR テーブルC.フィールドC1 = テーブルB.フィールドB1 テーブル名が長い場合は、以下のように 「テーブルA」を「TA」として略して使えます SELECT TC.* FROM テーブルA AS TA,テーブルB AS TB,テーブルC AS TC WHERE TC.フィールドX = TA.フィールドX OR TC.フィールドX = TB.フィールドX
補足
なるほど。。。始めて知りました!勉強になります。 「AS = ~であるとして」という意味で、略称に置き換えて記述できるというわけですね。 実はテーブル名が長いので、記述しているときにわけがわからなくなりそうだったんで、これは便利です。 実際には、TCのフィールドデータだけでなく、TAとTBの一部のフィールドデータも表示させたかったので、以下のようにセレクトしたいぶんを記述すればいいわけですね? SELECT TA.フィールドA1, TB.フィールドB1, TC.フィールドC1, TC.フィールドC2, TC.フィールドC3・・・ FROM テーブルA AS TA,テーブルB AS TB,テーブルC AS TC WHERE TC.フィールドC1 = TA.フィールドA1 OR TC.フィールドC1 = TB.フィールドB1
- Dxak
- ベストアンサー率34% (510/1465)
#1です > テーブルAのフィールドA1 > テーブルBのフィールドB1 > テーブルCのフィールドC1 > とした場合、 > SELECT * > FROM テーブルA > WHERE フィールドA1 Not In (SELECT フィールドB1 FROM テーブルB) > And フィールドA1 Not In (SELECT フィールドC1 FROM テーブルC); 相関関係は、問題ないと思いますよ
補足
ありがとうございます。そうですか・・・ それで実施してみたところ、えらく戻ってくるのに時間がかかり、結果、抽出データは無しでした。 データ的には、かならず一致するデータと不一致のデータを入れてテストしているのですが・・・
- pkh4989
- ベストアンサー率62% (162/260)
質問の内容だと、これかな? SELECT TC.* FROM テーブルA AS TA,テーブルB AS TB,テーブルC AS TC WHERE TC.フィールドX = TA.フィールドX OR TC.フィールドX = TB.フィールドX
補足
ご回答おそれいります。 そうすると・・・ SELECT テーブルC.* FROM テーブルA AS テーブルA, テーブルB AS テーブルB, テーブルC AS テーブルC WHERE テーブルC.フィールドC1 = テーブルA.フィールドA1 OR テーブルC.フィールドC1 = テーブルB.フィールドB1 のような記述となるのでしょうか?
- Dxak
- ベストアンサー率34% (510/1465)
#1です すみません Not In の後のユニオンクエリは動作しないみたい>< SELECT * FROM テーブルA WHERE フィールド Not In (SELECT フィールド FROM テーブルB) And フィールド Not In (SELECT フィールド FROM テーブルC); と、ただ「AND」で結ぶくらいしか無いみたい;;
補足
おそれいります。 それぞれのフィールドが、どのテーブルのフィールドなのかわかりませんので教えてください。 SELECT * FROM テーブルA WHERE フィールドA1 Not In (SELECT フィールドB1 FROM テーブルB) And フィールドA1 Not In (SELECT フィールドC1 FROM テーブルC); ということで、よろしいでしょうか?
- Dxak
- ベストアンサー率34% (510/1465)
サブクエリとユニオンクエリの話じゃないかな? Select ~ From テーブルA Where テーブルA.フィールド Not In (Select フィールド From テーブルB Union Select フィールド Form テーブルC) 基本的に「不一致」の場合、「結合」を使用しないようにした方が楽だよ
補足
SQLビューでクエリ保存をしようとしたところ、 (Select フィールド From テーブルB Union Select フィールド Form テーブルC) の部分で、「この操作は、サブクエリでは実行できません」と言われて保存ができないようです。 テーブルAのフィールドA1 テーブルBのフィールドB1 テーブルCのフィールドC1 とした場合、 Select テーブルA.フィールドA1, テーブルB.フィールドB1, テーブルC.フィールドC1 AS テーブルC.フィールドC2 AS テーブルC.フィールドC3・・・ From テーブルA Where テーブルA.フィールドA1 Not In (Select フィールドB1 From テーブルB Union Select フィールドC1 Form テーブルC) という記述で、よろしいのでしょうか?
お礼
ありがとうございました! 望みどおり実現することができました。