2013-05-15 65 views
5

所以我知道在查詢的WHERE子句中添加過濾器條件是一種很好的編程習慣,以便儘量減少在連接中返回的行數,但是當我們如何決定是否應該在WHERE而不是FROM中添加一個過濾器?例如:在WHERE中添加過濾器與FROM

SELECT a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM TblA a INNER JOIN TblB b 
On a.ColA = b.ColD 
AND a.ColA = 'X' 
AND a.ColB = 'Y' 
WHERE b.ColD = 'ABC' 

在此查詢,如果我說什麼b.ColD的AND子句,而不是在哪裏?這不會使查詢更有效率嗎?我知道這兩種方法的結果可能有所不同,但我不知道爲什麼?

謝謝。

+0

根據tsql標記判斷,您使用的是SQL Server。管理工作室能夠顯示查詢的執行計劃,因此您可以比較兩個版本的差異。雖然我的_guess_是沒有太大的區別。 –

+3

這不是一個重複:OP是詢問過濾器,而不是JOINs – gbn

+1

@gbn我不確定OP的措辭(「過濾器」與「條件」等)如此重要,因爲OP給出的例子基本上與[here](http://stackoverflow.com/q/1907335/880904),[here](http://stackoverflow.com/q/1018952/880904),[here](http:/ /stackoverflow.com/q/1401889/880904),[這裏](http://stackoverflow.com/q/15483808/880904)等等。所有這些都有'JOIN ... ON',詢問'WHERE',幷包括類似的答案給你。在我看來,這個問題已經得到解答,或者我們是否也應該重新開放[這個問題](http://stackoverflow.com/q/13145275/880904)? –

回答

2

在像SQL這樣的聲明性語言中,我發現儘可能地聲明性,也就是保持JOIN邏輯(「我該如何連接我的數據?」)與WHERE logic分開(「我要過濾什麼出來嗎?「)。

從技術上講,它可能沒有什麼區別,但如果你強迫自己將兩者分開,這是一個很好的理智檢查。

9

這很少會影響我的體驗。它可以但不經常。 查詢優化器可以解決這個問題,您無需再次猜測它。

當使用LEFT JOIN的,雖然,那麼就能夠決定的事情,因爲它改變了查詢語義

一般來說,I would separate JOIN and WHERE conditions for clarity and avoid ambiguities or partial/full cross joins。這個答案是獲得更多信息只有

注:問題是「在WHERE差異JOIN」,但「凡在JOIN差」

我只想做

SELECT 
    a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM 
    TblA a 
    INNER JOIN 
    TblB b On a.ColA = b.ColD 
WHERE 
    a.ColA = 'X' AND a.ColB = 'Y' AND b.ColD = 'ABC' 

或者,如果更復雜,我想讓它更好的閱讀
這也可以幫助,如果優化器是愚蠢(罕見):

SELECT 
    a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM 
    (SELECT ColA, ColB, ColC FROM TblA 
    WHERE ColA = 'X' AND ColB = 'Y') a 
    INNER JOIN 
    (SELECT ColD, ColE FROM TblB WHERE ColD = 'ABC') b On a.ColA = b.ColD 

在這最後一種情況下,人們也可以使用CTE來進一步將其分解爲可讀性