質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

11112閲覧

表別名について

jawa

総合スコア3013

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

2クリップ

投稿2015/10/22 03:20

VB.NETアプリケーション内でOracleに接続しDBからデータ取得を行っています。

今までOracle11g環境で動作していたこのモジュールを、Oracle12c環境で動作させたところエラーが発生してしまいました。

エラーの原因を調べたところ、SQLに誤りがあることがわかりました。

SQL

1SELECT A.COL1 AS A_COL1 2 , A.B.COL1 AS B_COL1 3FROM TBL_A A 4 LEFT JOIN TBL_B B 5 ON A.KEY_COL = B.KEY_COL

B_COL1はTBL_B.COL1を取得したかったため、以下に変更することでエラーは解消しました。

SQL

1SELECT A.COL1 AS A_COL1 2 , B.COL1 AS B_COL1 3FROM TBL_A A 4 LEFT JOIN TBL_B B 5 ON A.KEY_COL = B.KEY_COL

今回のエラー対応はこれで完了したのですが、Oracle11g環境でA.B.COL1という記述でエラーなく動作していたことが不思議でなりません。
結果を見る限りB.COL1の値が取得されているようなのですが、これはこれで何か意味のある記述方法なのでしょうか?

ご存知の方いらっしゃいましたらご教授願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

11g ではないのですが、手元に 10g があるのでちょっと試してみた結論としては、11gまでのバグかなと思います

10g でも次のクエリは通りました

sql

1SELECT A.COL1 AS A_COL1 2 , A.B.COL1 AS B_COL1 3FROM TBL_A A 4 LEFT JOIN TBL_B B 5 ON A.KEY_COL = B.KEY_COL

試してみておもしろいことがわかったのですが

A.B.COL1 の A のところを ZZZZZ.B.COL1 にしても、やはりクエリは通りました

それならと次のパターンを試したところ

"".B.COL1

長さゼロの識別子は無効です

(長さの有無は見てる!)

A.A.B.COL1

"A"."A"."B"."COL1": 無効な識別子です

(さらに1個多いのはダメ)

というようにエラーになりました

結合の向きを変えてみたらどうなるか?と思ったのでやってみたところ

LEFT JOIN → RIGHT JOIN

sql

1SELECT A.COL1 AS A_COL1 2 , A.B.COL1 AS B_COL1 3FROM TBL_A A 4 RIGHT JOIN TBL_B B 5 ON A.KEY_COL = B.KEY_COL

このケースではちゃんとエラーになりました

"A"."B"."COL1": 無効な識別子です

それならばと A.COL1 → A.A.COL1 として A.B.COL1 → B.COL1 と変化させてみたら

sql

1SELECT A.A.COL1 AS A_COL1 2 , B.COL1 AS B_COL1 3FROM TBL_A A 4 RIGHT JOIN TBL_B B 5 ON A.KEY_COL = B.KEY_COL

これは通ってしまいました

つまり、優先した方のテーブルに余分な修飾子が1個でもあるとエラーになりますが、他方には1個までなら空文字でない修飾子だとエラーにならない、ということがわかりました(なんじゃそりゃ!)

ちなみに INNER JOIN では、どちらにも余分な修飾子があるとしっかりエラーになります

12c になってバグが直されてちゃんとチェックしてくれるようになった、ということで

以上ご報告まで

投稿2015/10/22 09:22

takito

総合スコア3111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jawa

2015/10/23 03:32 編集

いろいろ調査までしていただいたようで、ありがとうございました。 ご報告いただいた動作から、「Aテーブルに結合したBテーブルの~」という意味でもあるのかと思ったのですが、それならばと --- SELECT A.COL1 AS A_COL1 , B.COL1 AS B_COL1 , C.COL1 AS C_COL1 , A.B.COL1 AS AB_COL1 , B.C.COL1 AS BC_COL1 , C.B.COL1 AS CB_COL1 , A.C.COL1 AS AC_COL1 , A.B.C.COL1 AS ABC_COL1 FROM TBL_A A LEFT JOIN TBL_B B ON A.KEY_COL = B.KEY_COL LEFT JOIN TBL_C C ON B.KEY_COL = C.KEY_COL --- のように記述して実行してみました。 「Aテーブルに結合したBテーブルにさらに結合したCテーブル」というイメージだったのですが、結果はA.B.C.COL1だけがエラーに。 C.B.COL1はOKなんですね・・・。 ともかく12cではエラーになるようになっていることですし、やはりバグなんでしょうね(^-^; ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問