SQL Server 2008pipe理工作室没有检查我的查询的语法

与往常一样,我会惊讶的有一个合理的解释,但直到那时……

我有这个查询

delete from Photo where hs_id in (select hs_id from HotelSupplier where id = 142) 

它执行得很好(后来我发现整个照片表是空的)

但奇怪的是: hs_id中没有字段hs_id ,叫做hs_key

所以当我执行最后一部分

 select hs_id from HotelSupplier where id = 142 

(用鼠标select查询的那一部分,然后按F5),我得到一个错误,但是当我在in子句中使用它时,它不会!

我不知道这是否是正常的行为?

它从外部查询中hs_id的值。

不合格的列引用从最接近的范围向外parsing,所以这只是作为相关的子查询处理。

这个查询的结果是从Photo中删除所有行,其中hs_id不为空,只要HotelSupplier至less有一行id = 142(这样子查询至less返回一行)

如果你考虑这是什么效果可能会更清楚些

 delete from Photo where Photo.hs_id in (select Photo.hs_id) 

这当然相当于

 delete from Photo where Photo.hs_id = Photo.hs_id 

顺便说一下,这是我个人在Microsoft Connect上错误报告的最常见的“错误”。 Erland Sommarskog将其包含在SET STRICT_CHECKS ON 愿望清单中

保持表名之间的列名一致是一个强有力的论据。 正如@Martin所说,当内部查询中没有匹配时,SQL语法允许从外部查询中parsing列名。 编写相关的子查询时,这是一个福音,但有时候可能会使你(如这里)