SQL Delete清除表而不是错误

Jon*_*ton 5 t-sql sql-server sql-server-2008 correlated-subquery

我有一块SQL(你认为)不会编译,而是删除目标表中的所有行.

考虑这个设置:

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

insert TableA values ('A'),('B'),('C');
insert TableB values ('A');
Run Code Online (Sandbox Code Playgroud)

然后是以下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;
Run Code Online (Sandbox Code Playgroud)

上面的delete语句会导致所有行被删除TableA,而不是ColumnA在其中不存在的错误TableB

这里有一个SQL小提琴:http ://www.sqlfiddle.com/#!3/9d883 /6

看来这个ColumnA来自TableA正在被接收,但预计它将"超出范围".

为什么是这样?

Ric*_*iwi 4

由于内部查询中的 ColumnA 与外部查询中的 ColumnA 之间的相关性,这按预期工作。

这种常用的相关查询模式是有效的

DELETE TableA WHERE NOT EXISTS (select * from TableB where TableB.ID=TableA.ID)
Run Code Online (Sandbox Code Playgroud)

它删除在 TableB 中没有相关记录的 TableA 条目。

它表明您可以在相关查询中引用 TableA 列。在您的查询中

delete TableA where ColumnA in (select ColumnA from TableB)
Run Code Online (Sandbox Code Playgroud)

内部查询正在生成

  • TableB 中每条记录占一行
  • 每行一列,其值为外部查询中的 ColumnA

所以 DELETE 会通过