SQL Delete limpa a tabela em vez de errar

Eu tenho um pedaço de SQL que (você acha) não compilaria, mas que, em vez disso, exclui todas as linhas da tabela de destino.

Considere esta configuração:

create table TableA (ColumnA varchar(200));
create table TableB (ColumnB varchar(200));

insert TableA values ('A'),('B'),('C');
insert TableB values ('A');

Então o seguinte sql:

--Returns all rows from TableA
select * from TableA;

--Does not error (ColumnA does not exist on TableB)
delete TableA where ColumnA in (select ColumnA from TableB)

--No Rows are returned
select * from TableA;

A instrução de exclusão acima faz com que todas as linhas sejam removidasTableA, em vez de errarColumnA não existe emTableB

Há um violino SQL demontrating isso aqui:http://www.sqlfiddle.com/#!3/9d883/6

Parece que oColumnA deTableA está sendo pego, mas esperava que fosse "fora do escopo".

Por que é isso?

questionAnswers(2)

yourAnswerToTheQuestion