一尘不染

的SQL Server 2008的管理工作室不检查我的查询语法

sql

一如往常,会有一个合理的解释令我感到惊讶,但直到那时....

我有这个查询

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

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

但是奇怪的是:hs_idHotelSupplier中没有字段,它被称为hs_key

所以当我执行最后一部分

select hs_id  from HotelSupplier where id = 142

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

我想知道这是否正常吗?


阅读 129

收藏
2021-05-05

共1个答案

一尘不染

hs_id 从外部查询中获取值。

一个查询不投影其select列表中所选表的任何列是完全有效的。

例如

select 10 from HotelSupplier where id = 142

将返回一个结果集,其中包含与该where子句匹配的行数以及10所有行的值的行数。

不合格的列引用是从最接近的范围向外解析的,因此这仅被视为相关的子查询。

该查询的结果将是删除Photo其中hs_id不为null的所有行,只要HotelSupplier至少具有id =
142的一行(因此子查询至少返回一行)

如果您考虑一下这样做的效果,可能会更清楚一点

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

2021-05-05