Почему я не могу использовать псевдоним таблицы и ее исходное имя в одном запросе, когда две таблицы объединены?

Предположим, есть две таблицы, созданные:

CREATE TABLE emp
(
EMPNO int,
EMPNAME varchar(255),
JOB varchar(255),
DEPTNO int
);

CREATE TABLE dept
(
LOC varchar(255),
DEPTNO int
);

Я хочу узнать, в каком отделе нет работы. Я использую такое левое соединение:

select dept.* 
from dept  
left join emp 
 on (dept.deptno=emp.deptno) 
where emp.empno is null;

Но если я использую псевдоним для dept или emp, я могу использовать только псевдоним и не могу использовать исходное имя таблицы. Например:

select dept.* 
from dept as d 
left join emp 
 on (dept.deptno=emp.deptno) 
where emp.empno is null;

Я получаю сообщение об ошибке «нет такой таблицы: отдел» от sqlite.

Если я выполняю операции с одной таблицей, я могу использовать псевдоним и исходное имя таблицы в одном запросе.

Кто-нибудь знает почему?


person Libo Yu    schedule 10.03.2013    source источник
comment
Вы, вероятно, ошибаетесь: вы не можете использовать исходное имя, если назначили другой псевдоним , даже если вы запрашиваете одну таблицу. В любом случае, насколько мне известно, поведение, которое вы наблюдаете, соответствует стандарту SQL.   -  person Andriy M    schedule 10.03.2013


Ответы (1)


Как только вы назначаете таблице псевдоним, это ее новое имя во время запроса - тогда исходное имя становится недоступным.

«Почему» связано со стандартом SQL. Если вы ищете объяснение того, почему было указано, что он работает таким образом, основная причина, о которой я могу думать, заключается в том, что если вы присоединяете таблицу к самой себе, вам нужно создать псевдоним хотя бы одной ссылки, чтобы различать их, но если вам было разрешено также использовать исходное имя, это было бы неоднозначно, поскольку оно могло относиться к любой ссылке.

Кроме того, если вы хотите использовать исходное имя, не назначайте псевдоним

person Bohemian♦    schedule 10.03.2013