为了账号安全,请及时绑定邮箱和手机立即绑定

Sqlserver 2008 Managementstudio不检查我的查询的语法。

Sqlserver 2008 Managementstudio不检查我的查询的语法。

交互式爱情 2019-07-04 17:56:22
Sqlserver 2008 Managementstudio不检查我的查询的语法。和往常一样,我的惊讶会有一个合理的解释,但在那之前.我有个疑问delete from Photo  where hs_id  in (select hs_id  from HotelSupplier where id = 142)它执行得很好(后来我发现整个照片表都是空的)但奇怪的是:没有田野hs_id在HotelSupplier中,它被称为hs_key!所以当我执行最后一部分select hs_id  from HotelSupplier where id = 142单独地(用鼠标选择查询的那一部分并按F5),我会得到一个错误,但是当我在in条款,没有!我想知道这是否正常的行为?
查看完整描述

3 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

它的价值hs_id从外部查询。

如果查询中没有从所选表中投影任何列,则该查询是完全有效的。select名单。

例如

select 10 from HotelSupplier where id = 142

返回的结果集与匹配的行数相同。where子句和价值10所有的行。

非限定列引用是从最近的范围向外解析的,因此这只是作为一个相关的子查询来处理。

此查询的结果将是从Photo哪里hs_id不为空,只要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

顺便说一句,这是我个人在MicrosoftConnect上看到的最常见的“bug”。Erland Sommarskog把它包括在他的愿望清单SET STRICT_CHECKS ON


查看完整回答
反对 回复 2019-07-04
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

这是在表之间保持列名一致的有力论据。正如@Martin所说,当内部查询中没有匹配时,SQL语法允许从外部查询解析列名。在编写相关子查询时,这是一件好事,但有时会让您感到困惑(如这里所示)。


查看完整回答
反对 回复 2019-07-04
?
撒科打诨

TA贡献1934条经验 获得超2个赞

只是想明确指出示例中的一个良好做法-包括整个查询过程中每个列的表名(两个部分标识符)。一般良好的做法,删除声明的宝贵实践!

查看完整回答
反对 回复 2019-07-04
  • 3 回答
  • 0 关注
  • 606 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信