2014-10-20 45 views
8

哪兩個人會表現得更好(我最近被指責不小心我的代碼,因爲我曾經在甲骨文以後):已存在/不存在:「選擇1」 VS「選場」

Select * 
from Tab1 
Where (not) exists(Select 1 From Tab2 Where Tab1.id = Tab2.id) 


Select * 
from Tab1 
Where (not) exists(Select Field1 From Tab2 Where Tab1.id = Tab2.id) 

或者他們都一樣嗎?

請從SQL Server視角和Oracle視角回答這兩個問題。

我已經使用了Google(大部分來自sql-server端),並發現仍然存在很多爭論,儘管我目前的觀點/假設是RDMBS中的優化器已經足夠成熟以理解所有必需的來自子查詢的是一個布爾值。

+1

沒什麼差別,它們都是一樣的。檢查兩個查詢的執行計劃以驗證。 – 2014-10-20 09:08:51

+0

看看這個答案..http://stackoverflow.com/a/6140367/2975396 – TheGameiswar 2016-09-11 13:00:44

回答

8

是的,它們是相同的。 exists檢查子查詢中是否至少有一行。如果是這樣,它的計算結果爲true。子查詢中的列無關緊要。

根據MSDNexists

指定的子查詢,以測試行的存在。

而且Oracle

的存在對於一個子查詢行的生存狀態測試。

也許MySQL documentation更是解釋:

傳統上,存在具有SELECT *子查詢開始,但它可以用SELECT 5開頭或選擇列1或任何東西。 MySQL在這樣的子查詢中忽略了SELECT列表,所以它沒有區別。

+0

它是否有所不同Postgres? – fatuhoku 2016-07-18 17:34:05

+0

我不知道。我沒有Postegres的經驗。 – 2016-07-18 17:57:14

+1

PostgreSQL是一樣的。你也可以選擇null作爲其他任何東西。 – 2016-09-11 12:49:30

4

我知道這是舊的,但要加我最近觀察到的幾個要點..

即使存在只檢查是否存在,當我們寫「SELECT *」所有,列將被擴大,除了這個輕微的開銷之外,沒有區別。

來源:
http://www.sqlskills.com/blogs/conor/exists-subqueries-select-1-vs-select/

更新:
文章中,我提到似乎不valid.Even雖然當我們寫,select 1,SQLServer的將擴大所有列..

請參閱以下鏈接進行深入分析和性能統計,使用各種方法時..

Subquery using Exists 1 or Exists *

+0

Conor的文章實際上是錯誤的。他建議'SELECT *'將擴展所有列元數據,而'SELECT 1'不會。但他們實際上都這樣做。你可以通過拒絕對一列的權限和運行'SELECT 1 WHERE EXISTS(SELECT 1 FROM T);''這可以意外地失敗,'SELECT SELECT權限在'Foo''列上被拒絕或者通過計算添加更多的列或者在調試器中查找http://stackoverflow.com/a/6140367/73226 – 2016-09-11 12:32:11

+0

@MartinSmith:非常感謝,我很久沒有回覆你的答案,但是有些錯過了幾件事情。謝謝你再次揭穿神話 – TheGameiswar 2016-09-11 13:15:31