2013-10-03 55 views
3

我想知道在使用WHERE子句或使用內連接的ON中的匹配方面是否有任何區別。與ON子句相比,WHERE子句中的過濾有什麼區別?

在這種情況下的結果是相同的。

首先查詢:

with Catmin as 
(
    select categoryid, MIN(unitprice) as mn 
    from production.Products 
    group by categoryid 
) 
select p.productname, mn 
from Catmin 
inner join Production.Products p 
on p.categoryid = Catmin.categoryid 
and p.unitprice = Catmin.mn; 

第二個查詢:

with Catmin as 
(
    select categoryid, MIN(unitprice) as mn 
    from production.Products 
    group by categoryid 
) 
select p.productname, mn 
from Catmin 
inner join Production.Products p 
on p.categoryid = Catmin.categoryid 
where p.unitprice = Catmin.mn;   // this is changed 

結果這兩個查詢:

result

+1

在這種情況下,結果與您從2個表格進行比較時相同。第一個將只選擇那些關於條件的綁定,第二個將綁定這兩個表並過濾條件。 –

+1

在SSMS工具欄上尋找一個按鈕,提示「包含實際執行計劃」 - 單擊它,然後運行查詢和比較。 –

回答

6

我的答案可能有點離題,但我想強調一個PROBL當您將INNER JOIN變爲OUTER JOIN時可能會發生這種情況。

在這種情況下,把之間最重要的區別謂詞(測試條件)上的ON或WHERE子句是,你可以左轉或右轉外連接到內部連接不知不覺,如果你把領域表在WHERE子句中省略。

例如,在表A和表B之間的LEFT JOIN中,如果在WHERE子句中包含涉及B的字段的條件,那麼在結果集中很可能沒有從B返回的空行。有效地,並且隱含地,你將你的左連接變成了內連接。另一方面,如果在ON子句中包含相同的測試,則空行將繼續返回。

例如,採取下面的查詢:

SELECT * FROM A 
LEFT JOIN B 
    ON A.ID=B.ID 

查詢也將從返回的行不匹配任何的B.

藉此第二個查詢:

SELECT * FROM A 
LEFT JOIN B 
WHERE A.ID=B.ID 

這第二個查詢不會從一個不匹配B返回任何行,即使你認爲它會因爲你指定一個LEFT JOIN。這是因爲測試A.ID = B.ID將省略結果集B.ID爲空的任何行。

這就是爲什麼我傾向於將謂詞放在ON子句中而不是在WHERE子句中。

+0

我在這裏學到的重要事情是ON子句在where子句之前被執行,這就是結果在連接後被過濾的原因。感謝你的回答! –

5

結果完全相同。 由於查詢的性能提高,建議使用「ON」子句。

不是從表中請求數據,而是使用on子句過濾,首先過濾第一個數據集,然後將數據連接到其他表。因此,需要較少的數據來匹配和更快的結果。

3

上述兩個查詢輸出之間沒有區別,它們都產生相同結果

當您使用ON子句的連接上ON條款

凡在Where條款的情況下,加入opeartion加入所有的行,然後過濾掉指定的codidtion匹配基於連接的操作只有那些行其中condidtion指定

所以,很顯然在條款更有效,應優先於地方condidtion