2016-07-26 51 views
1

結果我有一段時間以來的懷疑...什麼是過濾sql連接上的條目的最佳方法....我的意思是,更好在WHERE子句或ON的ON上?什麼是最好的方式來過濾JOIN(sql)

例如,有什麼更好?這段代碼使用WHERE

SELECT 
    customer.users_id AS CustID, 
    FROM customer 
    LEFT JOIN visit ON customer.users_id = visit.CustID 
    WHERE visit.active = 1 

或者這個其他方式(在對過濾器):

SELECT 
    customer.users_id AS CustID, 
    FROM customer 
    LEFT JOIN visit ON (customer.users_id = visit.CustID AND visit.active=1) 

謝謝。

+0

第一個是更好的迴應。 – kingtut007

+0

我的直覺告訴我,有些情況下,兩人不會給你同樣的答案(儘管我不能想到一個頭頂上的)。無論如何,在這種情況下,他們應該給你同樣的答案,而第二個「應該」更有效率。但是,SQL解釋器相當聰明,所以我會假設這些語句會在相同的時間內運行。因此,這歸結於風格。通常,使用where子句是更好的風格,因爲它不影響JOIN中的兩個表。 – BrandonM

回答

1

這取決於情況的類型是什麼。以下是兩個文本: -

第一個作爲Inner Join工作,沒有返回左表中的所有行,包括右表中的null。條件返回所有那些有visit 1的行。意味着它減少所有從結果具有活性其他然後1 or null行對應的那些行到左表

實施例: -

custome_id visit 
1   1 
2   1 

第二個返回具有對應於右表null條目行。

例子: -

custome_id visit 
1   1 
2   1 
3   null 
4   null 

注: - 在你的兩個語句CUSTOMER_ID不能爲空,因爲它具有隻剩表O/P。

1

歷史對我來說,它更有效地使用在聲明加入,而不是將其添加到WHERE子句。

SELECT 
customer.users_id AS CustID, 
FROM customer 
LEFT JOIN visit ON (customer.users_id = visit.CustID AND visit.active=1) 

有情況下,這兩種情況下可能會更有效,但對我來說,我更喜歡使用在連接語句。我相信如果它用在其中子句當查詢運行時它將不得不索引訪問表中的所有內容,然後根據過濾結果visit.active = 1。在我的經驗中,更快地使用和聲明和性能的地方在於查詢優化器如何索引數據。

更新:對於處理數百萬條記錄時,我注意到上面提到的更好的性能。如果記錄數量較小,可能對您沒有影響。

相關問題