プロが教えるわが家の防犯対策術!

ACCESS 2003を使用しています。

テーブルA
テーブルB
テーブルC
の3テーブルでクエリを作っています。結合的には・・・

テーブルAのフィールドX⇔テーブルCのフィールドX
テーブルBのフィールドX⇔テーブルCのフィールドX
です。

これで3テーブルに共通する一致データのみ抽出はできるのですが、
3テーブルに共通する一致データに加えて、テーブルAとテーブルBの不一致データ(テーブルCに対する)も一緒に抽出できるようにしたいのです。

2テーブルだけの結合であれば、結合プロパティを、
テーブルAのフィールドX⇒テーブルCのフィールドX
のようにすることで実現できるのですが、3テーブルの結合の場合、どのようにすればよいでしょうか?

テーブルAのフィールドX⇒テーブルCのフィールドX
テーブルBのフィールドX⇒テーブルCのフィールドX
のようにしてみましたが、「あいまいな外部結合が含まれているので、SQLステートメントを実行できません。云々。。。」と警告エラーがでてしまいます。

どなたが、ご教授いただけると助かります。
ご面倒ですが、よろしくお願い致します。

A 回答 (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
正解です
    • good
    • 0
この回答へのお礼

ありがとうございました!
望みどおり実現することができました。

お礼日時:2008/10/03 19:27

#1です



> 結果、抽出データは無しでした。

う~ん?日本語的に私の方が読み取れてないのかな?
具体的な話・・・

テーブルA
フィールドA1





テーブルB
フィールドB1




テーブルC
フィールドC1




と、した場合
結果、欲しいのは?

私の想定では、


が、出てくる結果を想定していたのですけど?

この回答への補足

お手数おかけしています。
欲しいデータは、

テーブルAフィールドA1とテーブルCフィールドC1をぶつけて
一致するデータおよび不一致するデータ

テーブルBフィールドB1とテーブルCフィールドC1をぶつけて
一致するデータおよび不一致するデータ

です。
これらを一回のクエリ実行で実現させたいわけです。
一致したデータはフィールドに存在し、不一致でデータが存在しないフィールドは空白になっている状態で、クエリ結果として出したいのです。

テーブルA
フィールドA1





テーブルB
フィールドB1




テーブルC
フィールドC1




と、した場合
欲しいのは結果は、以下のような感じのクエリ結果です。

テA:フィA1|テB:フィB1|テC:フィC1
a       |(空)    |(空)
b       |b      |(空)
c       |(空)    |(空)
d       |(空)    |d
(空)     |e      |(空)
(空)     |f       |(空)
(空)     |(空)    |g
(空)     |(空)    |h

補足日時:2008/10/03 16:03
    • good
    • 0

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

補足日時:2008/10/03 15:58
    • good
    • 0

#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);

相関関係は、問題ないと思いますよ

この回答への補足

ありがとうございます。そうですか・・・
それで実施してみたところ、えらく戻ってくるのに時間がかかり、結果、抽出データは無しでした。
データ的には、かならず一致するデータと不一致のデータを入れてテストしているのですが・・・

補足日時:2008/10/03 14:43
    • good
    • 0

質問の内容だと、これかな?



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

のような記述となるのでしょうか?

補足日時:2008/10/03 14:39
    • good
    • 0

#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);

ということで、よろしいでしょうか?

補足日時:2008/10/03 13:49
    • good
    • 0

サブクエリとユニオンクエリの話じゃないかな?



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)

という記述で、よろしいのでしょうか?

補足日時:2008/10/03 13:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!