電子書籍の厳選無料作品が豊富!

AccessのSQLで外部結合を複数使うと
SQLがエラーになります。
クエリで確認してエラーにならない様につくってみましたが、意図する事をやろうとするとエラーになります。
どこが悪いか教えていただけませんか?おそらくSQLサーバーでは余裕で通るSQLだと思うのですが。。。
SQL = SELECT * FROM T1
LEFT JOIN T2 ON T1.A = T2.A
LEFT JOIN T3 ON T1.B = T3.B
LEFT JOIN T4 ON T1.C = T4.C
AND T4.D = iNum
WHERE T1.E = 'iNum'
やりたいのはT1を基準にT2,T3,T4からデータを引っ張ってきたい。その条件としてT4から引っ張ってくるのは
T4.DがiNumである事、基準となるT1のT1.EがiNumである事です。
Accessでは"AND T4.D = iNum"がだめで、
WHERE区に書くと外部結合にもかかわらずT4.D = iNumのデータしか抽出されなくなる。(T1.C = T4.CのデータがT4.D = iNumでなくてもT1のデータが抽出されなくてはならない。)
さらに
SQL = SELECT * FROM ((T1
LEFT JOIN T2 ON T1.A = T2.A)
LEFT JOIN T3 ON T1.B = T3.B)
LEFT JOIN T4 ON T1.C = T4.C
AND T4.D = iNum
WHERE T1.E = 'iNum'
こんな括弧が必要になってくる。
これだとT1とT2を外部結合した結果をT3と外部結合して
さらにその結果をT4と外部結合しているという意味あいになってしまって、意図が違うのですが。。
結果は同じなのでAccessに譲ってやってもいいのですが
前者はT1で抽出されなければならないデータが抽出されないので困ります。
よろしくお願いいたします。

A 回答 (2件)

失礼、記述ミスしてました。


書きたかったのは、以下のSQLです。

SELECT * FROM ((T1
LEFT JOIN T2 ON (T1.A=T2.A))
LEFT JOIN T3 ON (T1.B=T3.B))
LEFT JOIN T4 ON (T1.C=T4.C AND T1.E=T4.E)
WHERE T1.E = 'iNum'
    • good
    • 0
この回答へのお礼

お返事おそくなって申し訳ありません。
回答いただいたSQLですが、
T4にEという項目はなく、
T1.E=T4.Eはできません。
No1の回答で私のつくったSQLをみていただいたら
何がしたかったのかがわかっていただけると思います。
ありがとうございました。

お礼日時:2005/12/13 08:59

たぶん、こんな感じで良いないかと。



SELECT * FROM ((T1
LEFT JOIN T2 ON (T1.A=T2.A))
LEFT JOIN T3 ON (T1.B=T3.B))
LEFT JOIN T4 ON (T1.C=T4.C AND T1.D=T4.D)
WHERE T1.E = 'iNum'

気になる部分だけ、コメントを書きますが・・

>これだとT1とT2を外部結合した結果をT3と外部結合して
>さらにその結果をT4と外部結合しているという意味あいになってしまって、
>意図が違うのですが。。

T1を基準として、結合条件とするなら、外部結合は、どのような順番で行っても、
結果は変わりませんよ。(少なくとも、上記の条件であれば、同じハズ)
    • good
    • 0
この回答へのお礼

早速回答いただき、ありがとうございます。

せっかく回答いただいたのですが、

>LEFT JOIN T4 ON (T1.C=T4.C AND T1.D=T4.D)
>WHERE T1.E = 'iNum'

T1には"D"という項目はなく、
T4のなかのT4.D = 'iNum' を満たすレコードのみ
CというKeyでT1と外部結合させたいのです。

今これを書いていて思いついたのですが、

SELECT * FROM ((T1
LEFT JOIN T2 ON (T1.A=T2.A))
LEFT JOIN T3 ON (T1.B=T3.B))
LEFT JOIN (SELECT * FROM T4 WHERE T4.D ='iNum') AS T5 ON T1.C=T5.C
WHERE T1.E = 'iNum'

でいけました~。
他に何かご存知の方ありましたら
教えてください。
よろしくお願いいたします。

お礼日時:2005/11/28 12:21

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