SQL Delete löscht die Tabelle, anstatt Fehler zu verursachen

Ich habe ein Stück SQL, das (Sie würden denken) nicht kompilieren würde, sondern das stattdessen alle Zeilen aus der Zieltabelle löscht.

Betrachten Sie dieses Setup:

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

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

Dann die folgende 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;

Die obige Anweisung delete bewirkt, dass alle Zeilen aus entfernt werdenTableA, anstatt das zu verkennenColumnA existiert nicht inTableB

Es gibt eine SQL-Geige, die dies hier demontiert:http://www.sqlfiddle.com/#!3/9d883/6

Es scheint, dass dieColumnA vonTableA wird abgeholt, aber es wird erwartet "out of scope".

Warum ist das?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage