回答

收藏

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

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

一如往常,会有一个合理的解释令我感到惊讶,但直到那时....
- o: v1 T6 N5 ?6 K我有这个查询
! }. o  X" I; k) A' }delete from Photo  where hs_id  in (select hs_id  from HotelSupplier where id = 142)
' S0 _, v$ |8 K9 c+ A# X. x这执行得很好(后来我发现整个照片表是空的)! J9 O: f4 \& T. s* K
但是奇怪的是:hs_idHotelSupplier中没有字段,它被称为hs_key!
6 t! O$ d' O( @+ l0 Y, `% |0 l所以当我执行最后一部分& g  J' J# R4 l3 e- L/ b9 v
select hs_id  from HotelSupplier where id = 142" X* H( t- H, C7 ]
分别(用鼠标选择查询的那一部分并按F5键),我得到一个错误,但是当我在in子句中使用它时,它不会!2 x9 ]6 N9 }! t: V6 B
我想知道这是否正常吗?
* ?9 y% s9 k7 c* L3 y: K               
! u% E6 u7 o; H4 S6 {* w解决方案:
& g- n6 {- ?, d) h2 f: R               
& a/ n- m8 \! q% a' z" N: H! m8 q+ c
, z! j! m5 Y& r, o
                它hs_id 从外部查询中获取值。
8 i' Y2 c4 H9 Y1 o# r0 q& m一个查询不投影其select列表中所选表的任何列是完全有效的。
" l2 `8 t( K3 h( z( P& `" }例如
& Z: g6 ?. R5 W- N% D( d* ~1 nselect 10 from HotelSupplier where id = 142
9 ]1 z% y# H, q  O5 F将返回一个结果集,其中包含与该where子句匹配的行数以及10所有行的值的行数。
- }$ G7 \) Y: }7 k不合格的列引用是从最接近的范围向外解析的,因此这仅被视为相关的子查询。
; N$ r% X- {+ l: t7 ]8 C# y0 [该查询的结果将是删除Photo其中hs_id不为null的所有行,只要HotelSupplier至少具有id =
$ M1 S, |; Y$ L142的一行(因此子查询至少返回一行)
0 D! G) f, X! f% k$ u如果您考虑一下这样做的效果,可能会更清楚一点
/ q, D; R4 b1 @0 }" j6 P# Idelete from Photo  where Photo.hs_id  in (select Photo.hs_id); F- l* {! x& p' O/ f+ x
这当然等同于
( `0 W, m. F. Ydelete from Photo where Photo.hs_id = Photo.hs_id
* G! r  ]5 P: \$ K) b  {1 q0 E顺便说一句,这是我个人在Microsoft Connect上错误地看到的最常见的“错误”。Erland
# S4 ^/ @; F. BSommarskog将其包含在他的愿望清单中,用于SET
) d% B9 O1 g* l0 f9 n4 o: Z1 b: SSTRICT_CHECKS ON
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则