• 締切済み

Accessの表結合SQL

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で抽出されなければならないデータが抽出されないので困ります。 よろしくお願いいたします。

みんなの回答

回答No.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'

kuisinbo_hanako
質問者

お礼

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

回答No.1

たぶん、こんな感じで良いないかと。 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を基準として、結合条件とするなら、外部結合は、どのような順番で行っても、 結果は変わりませんよ。(少なくとも、上記の条件であれば、同じハズ)

kuisinbo_hanako
質問者

お礼

早速回答いただき、ありがとうございます。 せっかく回答いただいたのですが、 >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' でいけました~。 他に何かご存知の方ありましたら 教えてください。 よろしくお願いいたします。

関連するQ&A