如果我們在IF EXISTS
中有一個SELECT
語句,一旦它在表中找到記錄就停止執行?例如:如果在T-SQL中存在的話
IF EXISTS(SELECT * FROM table1 WHERE Name='John')
return 1
else
return 0
如果在名爲約翰=表中存在的行,不停止執行,並返回1或它橫穿尋找更多的比賽整個表?
如果我們在IF EXISTS
中有一個SELECT
語句,一旦它在表中找到記錄就停止執行?例如:如果在T-SQL中存在的話
IF EXISTS(SELECT * FROM table1 WHERE Name='John')
return 1
else
return 0
如果在名爲約翰=表中存在的行,不停止執行,並返回1或它橫穿尋找更多的比賽整個表?
是的,它停止執行,所以這總是優於COUNT > 0
往往不會。
如果查看執行計劃,您將看到table1
的實際行數不會超過1,而不考慮匹配記錄的數量。
See this article for some discussion on EXISTS vs COUNT
如果合併EXISTS() AND EXISTS()
查詢但是你cannot rely on short circuiting。即如果第一個查詢是錯誤的並且因此整個表達式是假的,第二個查詢仍然被執行。
有沒有更好的辦法來做到以下幾點:IF EXISTS(SELECT * FROM T1 WHERE xxx和YYY) RETURN 2 ELSE BEGIN IF EXISTS(SELECT * FROM T1其中xxx) RETURN 1 ELSE 返回0 END我在存儲過程中存儲過程,存儲過程經常執行。我的主要動機是提高性能。我知道我可以在SELECT中使用常數1或0而不是*,但相應的性能改進可以忽略不計 – Sidd
@Sidd - 可能取決於確切查詢的內容和您擁有的索引。你可以改爲'SELECT TOP 1 * FROM t1 WHERE xxx ORDER BY some_condition_that_would_mean_yyyy_would_be_first'然後檢查結果。 –
有在這種情況下沒有必要「其他」:
IF EXISTS(SELECT * FROM table1 WHERE Name='John') return 1
return 0
具有返回值的RETURN語句不能在此上下文中使用。 – Aditya
僅供參考,您也可以考慮使用,而不是SELECT * SELECT 1,這樣就可以採取指標更好地利用(沒有檢索所有的字段從表中)。 – sfuqua
@sfuqua [這是一個神話](http://bradsruminations.blogspot.com/2009/09/age-old-select-vs-select-1-debate.html) –
IF EXISTS(SELECT 1/0 FROM table1 WHERE Name ='John')...這不會錯誤... SQL從不計算'SELECT'...它只是查看'WHERE'。 –