sql server 2008 management studio not checking the syntax of my query

后端 未结 2 1779
别跟我提以往
别跟我提以往 2020-11-22 08:23

As always, there will be a reasonable explanation for my surprise, but till then....

I have this query

delete from Photo  where hs_id  in (select hs_         


        
相关标签:
2条回答
  • 2020-11-22 08:46

    It's a strong argument for keeping column names consistent between tables. As @Martin says, the SQL syntax allows column names to be resolved from the outer query, when there's no match in the inner query. This is a boon when writing correlated subqueries, but can trip you up sometimes (as here)

    0 讨论(0)
  • 2020-11-22 08:51

    It is taking the value of hs_id from the outer query.

    It is perfectly valid to have a query that doesn't project any columns from the selected table in its select list.

    For example

    select 10 from HotelSupplier where id = 142
    

    would return a result set with as many rows as matched the where clause and the value 10 for all rows.

    Unqualified column references are resolved from the closest scope outwards so this just gets treated as a correlated sub query.

    The result of this query will be to delete all rows from Photo where hs_id is not null as long as HotelSupplier has at least one row where id = 142 (and so the subquery returns at least one row)

    It might be a bit clearer if you consider what the effect of this is

    delete from Photo  where Photo.hs_id  in (select Photo.hs_id)
    

    This is of course equivalent to

    delete from Photo where Photo.hs_id = Photo.hs_id
    

    By the way this is far and away the most common "bug" that I personally have seen erroneously reported on Microsoft Connect. Erland Sommarskog includes it in his wishlist for SET STRICT_CHECKS ON

    0 讨论(0)
提交回复
热议问题