Вы должны это сделать, потому что это , что говорят документы ;)
2.1.8.1 Когда требуются псевдонимы таблиц
Таблица псевдонимы могут потребоваться во избежание проблем с разрешением ссылок.
Oracle База данных требует, чтобы вы использовали псевдоним таблицы для определения любой точечно-нотационной ссылки на подпрограммы или атрибуты объектов , чтобы избежать внутреннего захват и аналогичные проблемы при разрешении ссылок.
ОК, поэтому почему существует ли это правило?
Рассмотрим этот сценарий:
create type emp_obj as object (
employee_id integer,
employee_name varchar2(100),
department_id integer
);
/
create table departments (
department_id integer,
manager emp_obj
);
/
create table manager (
employee_id integer,
employee_name varchar2(100),
department_id integer
);
select * from departments d
where exists (
select * from manager
where manager.department_id = d.department_id --which manager.department_id?
);
В этом примере
- В таблице
departments
есть столбец объекта manager
с атрибутом department_id
- В таблице
manager
есть столбец department_id
Так что же where manager.department_id
разрешает?!
При отсутствии псевдонимов это может быть любая таблица. Когда вы сохраняете объекты, вы можете иметь:
<table_name>.<column_name>
, идентичный <object_column_name>.<attribute_name>
из другой таблицы в том же запросе!
Когда вы начинаете добавлять / удалять столбцы из таблицы или атрибуты из тип, который создает разрешение имен ... удивляет.
Так что, чтобы избежать этого Oracle База данных предписывает использовать псевдонимы.
Так же, как вам нужно использовать псевдонимы, когда вы используете одну и ту же таблицу дважды в запросе:
create table t (
c1 int, c2 int
);
select * from t, t
where c1 = 1;
ORA-00918: column ambiguously defined
select * from t t1, t t2
where t1.c1 = 1;
no rows selected
Обратите внимание, что в этом правиле есть уточнение:
Использование псевдонима таблицы необязательно при прямой ссылке на атрибуты верхнего уровня таблицы объектов без использования точечной нотации. Например, следующие операторы определяют две таблицы, которые содержат тип объекта person_typ. person_obj_table - это таблица объектов для объектов типа person_typ, а contacts - это реляционная таблица, которая содержит столбец объекта person_typ.
При создании таблицы объектов атрибуты равны столбцы. Так что неясности выше go прочь.