有.怎麼會沒有! 效能為何,視資料內容,索引建立,執行計畫...而定.
1.你這樣做如果比較1.時,如果2.是Inner Join時,它做的Join數變少.1.的做法會變很大.但SQL本來就是做關聯式資料庫,所以...很多因素而定,很難直接判斷哪個較好.
2.已經進入了巢狀Join了,因為你用的是Left裡面Join跟外面Join數量是相等的,目前你只有一層,所以效能沒差很多.但多層巢狀時效能就差很多了.
我都是用第1種作法.因為我的Table關聯不只一個,一個查詢都好幾個Table去Join.如果你用括號,你很難知道哪個要放()先Join.除非你已經清楚它們的父子關係.或內部Join並有群組...情形下再用()去做.不然就用Where先去過濾出要的資料,然後打平直接Join就好了.
效能應該沒什麼差別,應該都一樣..
因為你做這樣的select,不管b、c、d的內容是什麼
都只會出現a這個Table的內容..
b、c、d的內容完全不會show出來
這樣的select是沒有什麼意義的..
除非,你的select改成以下的內容
<pre class="c" name="code">SELECT a.xxx , b.xxx, c.xxx, d.xxx
FROM a LEFT JOIN b ON a.a_id = b.a_id
LEFT JOIN c ON a.a_id = c.a_id
LEFT JOIN d ON a.a_id = c.a_id
及
<pre class="c" name="code">SELECT a.xxx , b.xxx, c.xxx, d.xxx
FROM ((a LEFT JOIN b ON a.a_id = b.a_id)
LEFT JOIN c ON a.a_id = c.a_id)
LEFT JOIN d ON a.a_id = c.a_id
這樣才會有些有意義的內容出現..
改成這樣的話,我個人認為第二種的效能應該會比較好一點
不過,大致上應該沒差啦..
說真的,我還真沒用過第一種的寫法
我一定會加上"()"來做個區別,以免出錯..
您可以用 SQL Query Analyzer(如果您是使用 MS SQL Server)
將 Execution Plan 打開,看一下分析的結果
基本上是一樣的
重點應該如 pantc328 大所提
資料內容、資料量、索引的建立以及查詢的先後順序才是真正影響效能的因素
如果您的查詢是 join 另一個查詢的結果,先後順序的影響會有差別
如:
<pre class="c" name="code">select a.*
from a left join b on a.a_id=b.a_id
left join c on a.a_id=c.a_id
left join d on a.a_id=d.a_id
與
<pre class="c" name="code">select a.*
from a left join d on a.a_id=d.a_id
left join b on a.a_id=b.a_id
left join c on a.a_id=c.a_id
會因為 join Table 的先後順序不一樣,而影響到查詢的效能