iT邦幫忙

0

LEFT JOIN的問題

sql
chan15 2009-06-17 19:46:4822065 瀏覽

請教一下

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 = c.a_id

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 = c.a_id

在效能各方面有沒有差別?

fillano iT邦超人 1 級 ‧ 2009-06-17 20:57:27 檢舉
這樣不會有JOIN發生吧?
24
pantc328
iT邦研究生 1 級 ‧ 2009-06-18 08:31:42
最佳解答

有.怎麼會沒有! 效能為何,視資料內容,索引建立,執行計畫...而定.
1.你這樣做如果比較1.時,如果2.是Inner Join時,它做的Join數變少.1.的做法會變很大.但SQL本來就是做關聯式資料庫,所以...很多因素而定,很難直接判斷哪個較好.
2.已經進入了巢狀Join了,因為你用的是Left裡面Join跟外面Join數量是相等的,目前你只有一層,所以效能沒差很多.但多層巢狀時效能就差很多了.

我都是用第1種作法.因為我的Table關聯不只一個,一個查詢都好幾個Table去Join.如果你用括號,你很難知道哪個要放()先Join.除非你已經清楚它們的父子關係.或內部Join並有群組...情形下再用()去做.不然就用Where先去過濾出要的資料,然後打平直接Join就好了.

20
魯大
iT邦高手 1 級 ‧ 2009-06-17 21:35:14

效能應該沒什麼差別,應該都一樣..
因為你做這樣的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

這樣才會有些有意義的內容出現..
改成這樣的話,我個人認為第二種的效能應該會比較好一點
不過,大致上應該沒差啦..
說真的,我還真沒用過第一種的寫法
我一定會加上"()"來做個區別,以免出錯..

外獅佬 iT邦大師 1 級 ‧ 2009-06-18 08:32:40 檢舉

沒有取出b或c的任何欄位....做 join 做什麼呢....費解...

總裁 iT邦好手 1 級 ‧ 2009-06-18 09:48:05 檢舉

當條件呀.

外獅佬 iT邦大師 1 級 ‧ 2009-06-18 09:59:50 檢舉

可是...LEFT JOIN...最左邊那個table應該會全部取出吧....
這樣的話...有filter的效果嗎?
馬上試試看....

22
jamesjan
iT邦高手 1 級 ‧ 2009-06-18 09:05:29

您可以用 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 的先後順序不一樣,而影響到查詢的效能

chan15 iT邦新手 5 級 ‧ 2009-06-18 10:53:36 檢舉

我只是想知道left join那個()的影響,所以取值跟篩選條件那些才沒下啊 XD

我要發表回答

立即登入回答