2009-09-02 44 views
3

這兩個查詢是否有所不同?使用innerjoin和直接在from段中編寫所有表是否有區別?

查詢1:

SELECT * FROM Table1, Table2 WHERE Table1.Id = Table2.RefId 

問題2:

SELECT * FROM Table1 INNER JOIN Table2 ON Table1.Id = Table2.RefId 

我分析這兩種方法,它們清楚地產生相同的實際執行計劃。你知道任何使用內部連接的情況都會以更高效的方式工作。使用內連接而不是接近「查詢1」的方式的真正優勢是什麼?

+0

類似的問題,我曾經有過:http://stackoverflow.com/questions/670980/performance-of-inner-join-compared-to-cross-join – soulmerge 2009-09-02 15:04:50

回答

3

您提供的兩個陳述在功能上等同於另一個。

該變化是由不同的SQL語法標準引起的。

對於一個非常令人興奮的閱讀,您可以通過訪問以下維基百科鏈接來查找各種SQL標準。右側是SQL和各種方言/標準的參考和鏈接。

http://en.wikipedia.org/wiki/SQL

+3

舊風格的外連接是在以後的版本中不推薦使用..所以對所有查詢使用JOIN都是有意義的。 – gbn 2009-09-02 14:57:59

1

這些將導致一個相同的查詢計劃,但INNER JOIN,OUTER JOIN,CROSS JOIN關鍵字是首選,因爲它們增加了代碼的清晰度。

雖然您可以使用FROM子句中的關鍵字指定聯接提示,但可以在WHERE子句中執行更復雜的聯接。但是,否則,查詢計劃中不會有任何區別。

3

這些SQL語句是同義的,雖然指定INNER JOIN是優選的方法和如下ISO格式。我更喜歡它,因爲它限制了從where子句加入表格的操作,並使查詢的目標更加清晰。

+0

也在左連接上,ON中的條件與WHERE中的條件完全不同。 – 2009-09-02 15:01:12

1

我還會補充說,第一種語法更容易受到無意中的交叉連接的影響,因爲查詢變得複雜了。此外,此語法中的左右連接在SQL Server中無法正常工作,因此不應使用該連接。在添加左連接時混合語法也會導致查詢無法正確返回結果的問題。第一個例子中的語法已經過時了17年,我沒有理由永遠使用它。

+0

我發現並修復了這個問題,當你寫這篇評論的時候肯定已經這樣做了。 – HLGEM 2009-09-02 15:05:37

0

查詢1被認爲是一種古老的語法風格,不鼓勵使用它。您將遇到使用該語法樣式使用LEFT和Right連接的問題。同樣在SQL Server上,您可能會在使用不同格式視圖的查詢中混合使用這兩種不同syles時遇到問題。

0

我發現使用LEFT OUTER JOIN S並將條件放在ON子句中的連接表上而不是WHERE子句中有顯着差異。一旦你在WHERE子句中的連接表上放置一個條件,就可以擊敗左外連接。

當我使用Oracle時,我使用了連接表(包含所有條件,包括WHERE子句中的連接條件)之後的陳舊(+),因爲這就是我所知道的。當我們成爲SQL Server商店時,我不得不使用LEFT OUTER JOIN,我發現它們沒有像以前那樣工作,直到我發現這種行爲。這裏有一個例子:

select NC.*, 
     IsNull(F.STRING_VAL, 'NONE') as USER_ID, 
     CO.TOTAL_AMT_ORDERED 
from customer_order CO 
INNER JOIN VTG_CO_NET_CHANGE NC 
ON  NC.CUST_ORDER_ID=CO.ID 
LEFT OUTER JOIN USER_DEF_FIELDS F 
ON  F.DOCUMENT_ID = CO.ID and 
     F.PROGRAM_ID='VMORDENT' and 
     F.ID='UDF-0000072' and 
     F.DOCUMENT_ID is not null 
where NC.acct_year=2017 
相關問題