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列名。 编写相关的子查询时,这是一个福音,但有时候可能会使你(如这里)