自然結合にqualifier (修飾子)は使えないのか?
SQL Develper のhrスキーマを使用してテスト。
select e.employee_id, e.first_name, e.last_name, department_id
from employees e NATURAL JOIN departments d
where department_id = 90
order by e.employee_id;
アウトプット成功:
101 Neena Kochhar 90
102 Lex De Haan 90
でも、
select e.employee_id, e.first_name, e.last_name, d.department_id
from employees e NATURAL JOIN departments d
where department_id = 90
order by e.employee_id;
エラーになる。
ORA-25155: NATURAL結合で使用される列は修飾子を持てません。
25155. 00000 - "column used in NATURAL join cannot have qualifier"
*Cause: Columns that are used for a named-join (either a NATURAL join
or a join with a USING clause) cannot have an explicit qualifier.
*Action: Remove the qualifier.
結果論:
department_idは両方のテーブルに入っているため、修飾子(表接頭辞)は使用できない。
「結合列には表接頭辞を使用しない。」というルールがある。どういうことか?
結合列というのは、データベースが列を結合するのに使用する列のことで、この例の場合は、両方の表に入っているdepartment_idである。この結合列に表接頭辞(修飾子)は入れるとエラーになる。
その他知っておくべき事項)修飾子(表接頭辞)は全部取ってもOK。だが、 結合列以外の列であれば、表接頭辞がある方がパフォーマンスが良くなる。
select employee_id, first_name, last_name, department_id
from employees e NATURAL JOIN departments d
where department_id = 90
order by e.employee_id;
もエラーなし。
その他知っておくべき事項)表のエイリアス(別名)をいれないでも、特にエラーなし。
select employee_id, first_name, last_name, department_id
from employees NATURAL JOIN departments
where department_id = 90
order by employee_id;
その他注意点)結合列として使われる条件:
1.2つの表に存在する同じ名前でないといけない
2.同じデータ型でないといけない。numberなど (データタイプはdescribe departments; で確認できる )
仮に、同じ名前だが、データタイプが異なる場合は、自然結合するとエラーになる。
3. 1と2を満たす結合列が2つ以上ある場合、結合列を指定することはできないため、共通するすべての列の組み合わせが同じである行のみ結合される、点も注意が必要。
以上