アプリ版:「スタンプのみでお礼する」機能のリリースについて

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文の記述方法を教えて頂けますでしょうか?

A 回答 (1件)

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に報告したばかりです。
    • good
    • 0
この回答へのお礼

私の方でも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

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