😱

Oracleはテーブル別名にASをつけられない

2024/12/10に公開

はじめに

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