Поведение подзапроса TSQL - PullRequest
       7

Поведение подзапроса TSQL

0 голосов
/ 08 сентября 2018

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

-- create and populate two tables with unique column names
create table tbl1 (col1 int);
insert tbl1 values (1);
create table tbl2 (col2 int);
insert tbl2 values (2);

-- execute query and subquery 
select col1 from tbl1 
    where col1 in (select col1 from tbl2);

Только подзапрос возвращает ожидаемую ошибку:

Invalid column name 'col1'.

Но полный запрос возвращает фиктивный результат без сообщения об ошибке.

query result

Что бы здесь ни происходило, официально ли оно документировано по стандарту Microsoft или SQL-92? Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Ссылка на подзапрос к столбцу 'col1' фактически ссылается на внешнюю таблицу:

select col1 from tbl1 
    where col1 in (select col1 from tbl2);
                          ^^^  this is 'col1' in table 'tbl1'

Это ведет себя как ожидалось:

select t1.col1 from tbl1 t1
    where t1.col1 in (select t2.col1 from tbl2 t2);

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

0 голосов
/ 08 сентября 2018

Это соотносится с tbl1. Всегда псевдоним ваших таблиц

Этот работает как ожидалось

create table tbl1 (col1 int);
insert tbl1 values (1);
create table tbl2 (col2 int);
insert tbl2 values (2);

-- execute query and subquery 
select col1 from tbl1 
    where col1 in (select Z.col1 from tbl2 Z);

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

Я бы не назвал псевдонимы обходным решением. Здесь нет обходного пути - это совершенно логично.

Вы можете копаться в определениях того, как работают коррелированные подзапросы, и вы, вероятно, найдете ответ, но я бы просто посчитал это уроком.

...