😱
Oracleはテーブル別名にASをつけられない
はじめに
RDMSユーザーのみなさんこんにちは。
今回はまたまたOracleの仕様に驚いた記事です。
前回のOracleビックリ記事はこちら。
対象読者
- Oracleユーザー
- 複数のDBを同時に使っている方
結論
Oracle
--エラーになる例
SELECT
e.employee_id AS emp_id --列別名にASは問題なし
, e.first_name AS fname
FROM
employees AS e; --テーブル別名にASを使うとエラー
Oracle
--エラーにならない例
SELECT
e.employee_id AS emp_id
, e.first_name AS fname
FROM
employees e; --ASを使わなければエラーにはならない
本文
気づきにくいエラー
このエラーについて、以下のようなエラー文が出てきます。
ORA-00933: SQLコマンドが正しく終了されていません。
このように書かれていますが、必ずしもクエリの最後が間違ってるとは限りません。
Oracle
SELECT
e.employee_id AS emp_id
, e.first_name AS fname
, e.last_name AS lname
, e.salary AS emp_salary
, d.department_name AS dept_name
, (
SELECT
AVG(salary)
FROM
employees
WHERE
department_id = e.department_id
) AS avg_dept_salary
, CASE
WHEN e.salary > 10000
THEN 'High Earner'
WHEN e.salary BETWEEN 5000 AND 10000
THEN 'Mid Earner'
ELSE 'Low Earner'
END AS salary_category
FROM
employees AS e --ここがエラーの原因
JOIN departments d
ON e.department_id = d.department_id
LEFT JOIN locations l
ON d.location_id = l.location_id
WHERE
e.salary > (SELECT AVG(salary) FROM employees)
AND e.hire_date > TO_DATE('2015-01-01', 'YYYY-MM-DD')
AND l.city = 'New York'
ORDER BY
avg_dept_salary DESC
, e.salary DESC
, e.last_name ASC;
例えばこの例のようにJOIN句・WHERE句・ORDER BY句が続いていたとしても
上述のエラー文が出てきます。
とても分かりにくい!
「ASを書かなければいいんじゃないですか?」について
このエラーについて別名をつけるときにASをつけなければ起こりはしません。
しかし、私は別名をつける場合はASを使いたい!なぜならASが無いと見にくいから!
というか他のプログラミング言語に区切り無しで単語が連続して並ぶことあるんでしょうか?
ChatGPT君に質問してみました。
1.C言語やC++のポインタ宣言
C・C++
int* p;
きちんと"*"で区切られています。
2.Pythonにおけるパラメータ名と型アノテーション
Python
def process_data(data: list):
pass
dataという引数にlist型を指定しています。
これに関しても":"で区切られています。
3.TypeScriptにおける関数引数
TypeScript
function processData(data: string) {}
これも":"で区切られています。
これら3つの例のように基本的には記号で区切られる場合がほとんどのようです。
可読性の為にもASはつけたいですが、Oracleを扱う際には気を付けましょう!
まとめ
- Oracleには独自仕様が多いので注意する。
- 他人が理解しやすいコードを意識する。
Discussion