Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Delete清除表而不是出错_Sql Server_Sql Server 2008_Tsql_Correlated Subquery - Fatal编程技术网

Sql server SQL Delete清除表而不是出错

Sql server SQL Delete清除表而不是出错,sql-server,sql-server-2008,tsql,correlated-subquery,Sql Server,Sql Server 2008,Tsql,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'); 然后使用以下sql: --Returns all rows from TableA select *

我有一段SQL,您可能认为它不会编译,但它会从目标表中删除所有行

考虑以下设置:

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

insert TableA values ('A'),('B'),('C');
insert TableB values ('A');
然后使用以下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;
上面的delete语句会将所有行从
表A
中删除,而不会导致
列A
表B
中不存在的错误

这里有一个SQL FIDLE来说明这一点:

似乎正在从
表A
中选取
列A
,但预计它“超出范围”


这是为什么?

由于内部查询中的ColumnA与外部查询中的ColumnA之间的关联,因此它可以按预期工作

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

DELETE TableA WHERE NOT EXISTS (select * from TableB where TableB.ID=TableA.ID)
它删除TableB中没有依赖记录的TableA条目

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

delete TableA where ColumnA in (select ColumnA from TableB)
内部查询正在生成

  • 表B中的每条记录对应一行
  • 每行一列,其值为ColumnA from outer query

因此,删除经过了

,虽然我理解这种混乱,但它的行为应该是正常的。ColumnA仍在“范围内”。事实上,如果您愿意,您可以在子查询中加入它。括号并没有限制范围,但从可读性的角度来看,我可以看到它造成的混乱


这是另一个例子,说明了为什么总是在列名前面加上表名(或别名)是个好主意。

绝对不要在列名前面加上表名,伙计,这会是一个难看的模式,但一定要使用别名。。。