Tengo un fragmento de SQL que (se podría pensar) no compilaría, pero que en su lugar borrará todas las filas de la tabla de destino.SQL Delete borra la tabla en lugar de error
Considere esta configuración:
create table TableA (ColumnA varchar(200));
create table TableB (ColumnB varchar(200));
insert TableA values ('A'),('B'),('C');
insert TableB values ('A');
A continuación, el siguiente 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;
La instrucción de eliminación anterior hace que todas las filas sean retirados de TableA
, en lugar de erroring que ColumnA
no existe en TableB
Hay un SQL Fiddle demostrando esto aquí: http://www.sqlfiddle.com/#!3/9d883/6
Parece que se está recogiendo ColumnA
de TableA
, pero esperaba que fuera "fuera de alcance".
¿Por qué es esto?
Definitivamente no prefijo los nombres de las columnas con los nombres de las tablas, hombre que sería un esquema feo, pero definitivamente use alias ... – emalamisura