2012-12-05 51 views
2

我使用SQL Server 2008的條件在on子句

請告訴我之間的區別在於:

隨着Where條款

select customer.Id, 
     order.Id 
    from Customer customer 
     left outer join Order order on order.customerId = customer.Id 
    where 
     order.deleted =0 

在條件隨着條件對ON條款

select customer.Id, 
     order.Id 
    from Customer customer 
     left outer join Order order 
      on order.customerId = customer.Id 
      and order.deleted =0 

那麼兩者如何與

select customer.Id, 
     order.Id 
    from Customer customer 
     inner join Order order on order.customerId = customer.Id 
    where 
     order.deleted =0 
+0

與指定「WHERE」(只要它適用於該連接表)的區別沒有區別。然後你使用一個'INNER JOIN'來返回兩個表的匹配。一個'LEFT OUTER JOIN'將返回左表,以及右表的匹配或不匹配('NULL')結果。 – Kermit

回答

0

我認爲你應該瞭解sql joins。這是一個nice link開始。

基本上,

  • 案例1:你過濾order.deleted =0這可能是null因爲它 是right table of a left join。如果右表不具有映射的行,從該表中的列將是空的。它應該是爲ISNULL(order.deleted,0)=0或者order.delete IS NULL or order.delete=0

  • 案例2ON是其中兩個表都加入檢查(我認爲)的加入

  • 案例3前的狀態和 條件order.deleted =0:簡單的JOIN or INNER JOIN哪裏有精確的行從兩側映射

+1

[我對w3schools的看法](http://www.w3fools.com)... [更好的資源來了解'JOIN's](http://blog.sqlauthority.com/2009/04/13/ sql-server-introduction-to-joins-basic-of-joins /) – Kermit

+0

@nik。感謝有關w3school的事情。我也喜歡Pinal Dave的例子和解釋。改變了它。謝謝。 – Kaf

0

把他們都在SSMS查詢窗口,輸入ctrl+l(或關閉該選項上顯示實際執行計劃的查詢運行後),請參閱SQL生成計劃。它會告訴你它有什麼不同。 SQL將做出關於查詢的決定以使其最佳地執行,這可以根據您的系統(即索引等)而變化。

執行LEFT JOIN可能會以不同的執行計劃結束,除非SQL可以說「嘿,你說的是LEFT JOIN,但是你的WHERE子句基本上使它像INNER JOIN一樣工作」並且爲你修復/優化了一些東西。

0

讓我們有兩張表

客戶

ID 
1 
2 
3 

訂購

ID Customer 
------------  
1 1 
2 2 
3 2 

客戶3沒有任何訂單。

當一個LEFT JOIN從CUSTOMERORDER列所做的ORDER表將是空的客戶3.因此,如果條件是在哪裏聲明,將不予退還客戶沒有秩序。如果條件處於「開啓」狀態,則不包括這些訂單。

0

讓我特意回答你的問題。

如果不在執行計劃中,第一個和第三個查詢的結果是相同的。 where子句正在查看left outer join的第二個表中的字段。第一個表中的任何行,但不是第二個表中的行都將具有NULL值並被濾除。

第二個查詢將保留第一個表中的所有行及其所有訂單(如果有的話)。