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正在被接收,但预计它将"超出范围".
为什么是这样?
由于内部查询中的 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)
内部查询正在生成
所以 DELETE 会通过
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |