почему я не получаю ошибку? Как база данных понимает соответствующий столбец во вложенном подзапросе? - PullRequest
0 голосов
/ 29 июня 2018

Вот сценарий: У меня две таблицы отдела и сотрудника. когда я выбираю столбец из таблицы, которой нет в этой таблице, он выдает ошибку, как и ожидалось. Тем не менее, когда я использую подзапрос и снова выбираю тот же столбец из той же таблицы, это работает. Я не понимаю, как это может игнорировать мою ошибку.

create table department
( DEPT_ID                    NUMBER(2),
 DEPT_NAME                  VARCHAR2(6) );

 insert into department values(1,'ch');

 create table employee
 ( EMP_ID                     NUMBER(2),
 EMP_NAME                   VARCHAR2(6),
 EMP_DEPT_ID                NUMBER(2)
 );

 insert into employee values(0,'ch',1);

--getting  error for below (ORA-00904: "DEPT_ID": invalid identifier)
 select dept_id
from employee;

 -- not getting any error and can see the output for below sql statement. How it can consider invalid column for employee table dept_id in this query.
 select *
from   department
where dept_id in 
(
-- Incorrect column name
select dept_id
from employee
);

Я пробовал это с 2 Oracle RDBMS и MSSQL. Случай одинаков с обоими. Я не общался с другими

1 Ответ

0 голосов
/ 29 июня 2018

Поскольку вы не определяете столбцы, ваш запрос

select *
from   department
where dept_id in 
(
-- Incorrect column name
select dept_id
from employee
);

будет «оценено» как

select d.*
from   department d
where d.dept_id in 
(
select d.dept_id
from employee e
);

Подзапрос может ссылаться на столбцы своего внешнего запроса. Всегда квалифицируйте все столбцы, если задействовано более одной таблицы!

То, что вы, вероятно, хотите, это

select d.*
from   department d
where d.dept_id in 
(
select e.EMP_DEPT_ID
from employee e
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...