回答

收藏

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

技术问答 技术问答 101 人阅读 | 0 人回复 | 2023-09-13

一如往常,会有一个合理的解释令我感到惊讶,但直到那时...." U0 N8 D& o! }5 ?, i; q3 L/ Q% w! t- V
我有这个查询
1 \4 T; P7 w6 L( b5 ~" d: ~- @7 {$ D' vdelete from Photo  where hs_id  in (select hs_id  from HotelSupplier where id = 142)6 c# e7 Q& a% x( m6 |" M! A- n
这执行得很好(后来我发现整个照片表是空的)
4 x2 O. a* ^0 y, r, d2 }但是奇怪的是:hs_idHotelSupplier中没有字段,它被称为hs_key!% r6 H- [. X2 o: B; G
所以当我执行最后一部分
; i; z* Z2 X; o" C" I. G6 Fselect hs_id  from HotelSupplier where id = 142! ^, d& ^0 x% Q
分别(用鼠标选择查询的那一部分并按F5键),我得到一个错误,但是当我在in子句中使用它时,它不会!
9 o1 J/ q, M7 B* a3 H我想知道这是否正常吗?1 s/ M. {' @7 _7 c/ }. r
                6 p- q3 ~) X, l9 ^& s8 `$ V
解决方案:/ F: O2 k" _8 z0 B- w9 G. u
                - ]1 Y0 Y# p" z

( l+ n0 W' T- U: X5 y: G
0 ]' I2 m) x9 F; L! H( @                它hs_id 从外部查询中获取值。
; R! k( v. R' p% {一个查询不投影其select列表中所选表的任何列是完全有效的。
0 o9 p8 d- W" L! t/ q, S例如% @% S% u) {! f! X# G
select 10 from HotelSupplier where id = 142, h' D9 u, U5 |: A: u) i7 V% O
将返回一个结果集,其中包含与该where子句匹配的行数以及10所有行的值的行数。# h  S$ c9 p5 d
不合格的列引用是从最接近的范围向外解析的,因此这仅被视为相关的子查询。# z8 X* f0 Y- E' {1 e; E- Y5 r: h
该查询的结果将是删除Photo其中hs_id不为null的所有行,只要HotelSupplier至少具有id =8 M! c8 u! i  M0 h! A  u$ R
142的一行(因此子查询至少返回一行)
# |6 h0 ?( o3 k. G# O& D如果您考虑一下这样做的效果,可能会更清楚一点
6 Y  K) _2 e9 l6 R) j' wdelete from Photo  where Photo.hs_id  in (select Photo.hs_id)5 H8 e; s& @) l+ M+ b8 p* ]  j3 ]
这当然等同于$ X, W% r6 q$ K: \- x8 g) b4 C
delete from Photo where Photo.hs_id = Photo.hs_id
6 D+ ~0 @5 b3 I顺便说一句,这是我个人在Microsoft Connect上错误地看到的最常见的“错误”。Erland3 y/ R5 g8 y/ ?$ b& z# e
Sommarskog将其包含在他的愿望清单中,用于SET
- Y* N$ }7 T" n' l# H* V2 nSTRICT_CHECKS ON
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则