2011-01-04 35 views
9

Như mọi khi, sẽ có một lời giải thích hợp lý cho sự ngạc nhiên của tôi, nhưng đến lúc đó ....sql studio quản lý server 2008 không kiểm tra cú pháp truy vấn của tôi

Tôi có truy vấn này

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

chỉ thực hiện tốt (sau này tôi phát hiện thấy toàn bộ bảng ảnh trống)

nhưng điều lạ: không có trường hs_id trong HotelSupplier, nó được gọi là hs_key!

Vì vậy, khi tôi thực hiện phần cuối cùng

select hs_id from HotelSupplier where id = 142 

riêng (chọn một phần của truy vấn với chuột và nhấn F5), tôi nhận được một lỗi, nhưng khi tôi sử dụng nó trong mệnh đề in, nó không!

Tôi tự hỏi đây có phải là hành vi bình thường không?

Trả lời

20

Đang lấy giá trị hs_id từ truy vấn bên ngoài.

Các tham chiếu cột không đủ tiêu chuẩn được giải quyết từ phạm vi gần nhất ra ngoài để điều này chỉ được coi là truy vấn phụ tương quan.

Kết quả của truy vấn này sẽ xóa tất cả các hàng từ Photo nơi hs_id không phải là null càng lâu càng HotelSupplier có ít nhất một dòng nơi id = 142 (và do đó lợi nhuận subquery ít nhất một dòng)

nó có thể là một chút rõ ràng hơn nếu bạn xem xét những gì tác dụng của việc này là

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

Đây là khóa học tương đương với

delete from Photo where Photo.hs_id = Photo.hs_id 

Bằng cách này là xa và phổ biến nhất "lỗi" mà cá nhân tôi đã nhìn thấy sai lầm được báo cáo trên Microsoft Connect. Erland Sommarskog bao gồm nó trong wishlist của mình cho SET STRICT_CHECKS ON

+5

+1 - Chỉ muốn chỉ ra một cách thực hành tốt trong ví dụ của bạn - bao gồm tên bảng cho mỗi cột (hai phần số nhận dạng) trong suốt truy vấn của bạn. Thực hành tốt nói chung, thực hành vô giá trong các báo cáo xóa! –

+1

Cảm ơn, tôi không biết điều đó. Mặc dù nó là lạ mặc dù, rằng (trong phiên bản đơn giản của bạn cũng) notn-hiện tại 'chọn Photo.hs_id' không tạo ra một lỗi – Michel

+2

@Michel - Nó không phải là không tồn tại. Nó được coi là truy vấn con tương quan và được đánh giá cho mỗi hàng bằng giá trị được truyền vào từ truy vấn bên ngoài. –

1

Đó là một lập luận mạnh mẽ để giữ tên cột nhất quán giữa các bảng. Như @Martin nói, cú pháp SQL cho phép các tên cột được giải quyết từ truy vấn bên ngoài, khi không có kết quả phù hợp trong truy vấn bên trong. Đây là một lợi ích khi viết các truy vấn con tương ứng, nhưng đôi khi có thể đi đôi với bạn (như ở đây)

+0

vâng, hoàn toàn đồng ý, sự kết hợp trong db này là rất xa. textkey, textid, text_key, text_id, hsid, hs_id, v.v. brrrrr – Michel

+0

Tất nhiên, điều đó không có ích nếu bạn nhập sai tên bảng không có quyền – Kevin

Các vấn đề liên quan