почему я не получаю ошибку? как база данных понимает соответствующий столбец во вложенном подзапросе?

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

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 RDBMS oracle и MSSQL. Случай с обоими одинаков. с другими не проверял


person Shiwangini    schedule 29.06.2018    source источник
comment
Вопрос о масштабе. Подзапрос может ссылаться на столбцы внешнего запроса. Всегда уточняйте все столбцы, если задействовано более одной таблицы.   -  person jarlh    schedule 29.06.2018
comment
Укажите правильные имена столбцов, даже если SQL знает, как использовать внешние ссылки. Вот почему у вас есть некоторые ошибки. Он называется emp_dept_id, а не dept_id у сотрудника.   -  person SqlKindaGuy    schedule 29.06.2018


Ответы (1)


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

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
);
person jarlh    schedule 29.06.2018