こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

複数テーブルを結合するには?

OS:WINDOWSXP SP2
ORACLE:Oracle9i Enterprise Edition Release 9.2.0.1.0

A, B, Cというテーブルがあるとします。
それぞれのテーブルには XXカラムと YYカラムがあるとします。

2つのテーブルを結合させるには、以下のSQL文を記述すれば良いと考えています。
SELECT A.*,B.* FROM A JOIN B
ON A.XX = B.XX

3つのテーブルを結合するには、以下のSQL文を記述しています。
SELECT A.*,B.*,C.* FROM A JOIN B
ON A.XX = B.XX
JOIN C
ON A.XX = C.XX

但し、この記述方法でいきますと、Cテーブルを右側外部結合に指定した場合のみ、
ORA-00904 "C" 無効な識別子です。
というエラーメッセージが表示されます。
SELECT A.*,B.*,C.* FROM A JOIN B
ON A.XX = B.XX
RIGHT OUTER JOIN C (←LEFT OUTER、FULL OUTER)なら通ります)
ON A.XX = C.XX

何故、右側外部結合のみ不正となるのか不明であり、解決策が見つかりません。
複数のテーブルを結合する為のSQL文の記述方法を教えて頂けますでしょうか?

投稿日時 - 2008-06-05 15:25:26

QNo.4077283

すぐに回答ほしいです

質問者が選んだベストアンサー

10g ですが、問題なく動きました。
もし、動かないようでしたら、Oracleのバグかもしれません。
JOINキーワードを使った構文を、Oracleは取り入れたばかりなので、結構問題が多いようです。
少なくとも、この問題は10gでは解決しているようです。

Oracle方言の下のSELECT文を試してみてください。

select A.*,B.*,C.* from A,B,C
WHERE A.XX(+) = B.XX
AND B.XX(+) = C.XX;

私は、つい最近natural joinをかけた後のCOUNT(*)のバグを発見して、Oracleに報告したばかりです。

投稿日時 - 2008-06-05 18:54:34

お礼

私の方でも10gの環境で同じSQL文を実行してみました。
結果、問題なく動きました。

9iの方では
ORA-00904 "C" 無効な識別子です。
というエラーが表示される辺り、どうやらオラクルのバグのようです。

これだけだと何ですので、少し私が調べた結果を載せて解決済にしたいと思います。

SELECT区を個別に*で取得するとエラーとなりましたが、

SELECT * FROM~ とするか、

SELECT A.XX,A.YY,B.XX,B.YY,C.XX,C.YY FROM A JOIN B
ON A.XX = B.XX
RIGHT OUTER JOIN C
ON A.XX = C.XX
のように一つずつ指定するとエラーを回避できました。

お蔭様で解決できました。ありがとうございます。

投稿日時 - 2008-06-06 10:43:03

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問