2011-09-07 30 views
41

Nếu chúng tôi có tuyên bố SELECT bên trong IF EXISTS, việc thực thi có dừng ngay khi tìm thấy bản ghi trong bảng không? Ví dụ:NẾU EXISTS trong T-SQL

IF EXISTS(SELECT * FROM table1 WHERE Name='John') 

return 1 

else 

return 0 

Nếu một hàng tồn tại trong bảng có tên = John, nó có dừng hoạt động và trả về 1 hoặc chuyển nó qua toàn bộ bảng tìm kiếm các kết quả phù hợp hơn không?

+0

FYI, bạn cũng có thể cân nhắc sử dụng SELECT 1 thay vì SELECT * để bạn có thể tận dụng tốt hơn các chỉ số (không phải lấy tất cả các lĩnh vực từ cái bàn). – sfuqua

+14

@sfuqua [Đây là một huyền thoại] (http://bradsruminations.blogspot.com/2009/09/age-old-select-vs-select-1-debate.html) –

+2

NẾU DANH SÁCH (SELECT 1/0 FROM table1 WHERE Name = 'John') ... điều này sẽ không lỗi ... SQL không bao giờ đánh giá 'SELECT' ... nó chỉ nhìn vào' WHERE'. –

Trả lời

47

Có nó ngừng thực thi vì vậy điều này luôn được ưu tiên là COUNT > 0 thường không.

Nếu bạn nhìn vào kế hoạch thực hiện, bạn sẽ thấy rằng số hàng thực tế sắp ra khỏi table1 sẽ không nhiều hơn 1 bất kể số lượng bản ghi trùng khớp.

See this article for some discussion on EXISTS vs COUNT

Nếu bạn kết hợp EXISTS() AND EXISTS() truy vấn tuy nhiên bạn cannot rely on short circuiting. tức là nếu truy vấn đầu tiên là sai và do đó toàn bộ biểu thức là sai thì truy vấn thứ hai vẫn được thực thi.

+1

Có cách nào tốt hơn để làm sau: IF EXISTS (SELECT * FROM t1 ĐÂU xxx VÀ yyy) RETURN 2 ELSE BEGIN IF EXISTS (SELECT * FROM t1 ĐÂU xxx) RETURN 1 ELSE RETURN 0 END Tôi có điều này bên trong một proc được lưu trữ và proc được lưu trữ được thực hiện rất thường xuyên. Động lực chính của tôi là cải thiện hiệu suất. Tôi biết tôi có thể sử dụng hằng số 1 hoặc 0 thay vì * trong SELECT nhưng cải thiện hiệu suất tương ứng là không đáng kể – Sidd

+0

@Sidd - Có thể phụ thuộc vào truy vấn chính xác là gì và chỉ mục nào bạn có. Bạn có thể thay thế 'SELECT TOP 1 * FROM t1 WHERE xxx ORDER BY some_condition_that_would_mean_yyyy_would_be_first' sau đó kiểm tra kết quả. –

-3

Không cần cho "khác" trong trường hợp này:

IF EXISTS(SELECT * FROM table1 WHERE Name='John') return 1 
return 0 
+0

Câu lệnh RETURN với giá trị trả về không thể được sử dụng trong ngữ cảnh này. – Aditya

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