On子句中的条件

时间:2012-12-05 19:52:39

标签: sql sql-server join

我正在使用SQL Server 2008。

区别是:

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

4 个答案:

答案 0 :(得分:0)

将它们全部放在SSMS的查询窗口中并键入ctrl+l(或打开查询运行后显示实际执行计划的选项)并查看SQL生成的计划。它会告诉你它是如何不同的。 SQL将决定查询以使其最佳地执行,这可能因系统而异(即索引等)。

执行LEFT JOIN可能会以不同的执行计划结束,除非SQL可以说“嘿,你说LEFT JOIN但你的WHERE子句基本上使它像INNER JOIN一样运行”并为你修复/优化。< / p>

答案 1 :(得分:0)

我认为你应该了解sql joins。这是一个nice link开始。

基本上,

  • 案例1 :您正在过滤order.deleted =0,因为它可能是nullright table of a left join。如果右表没有映射行,则该表中的列将为空。它应该是ISNULL(order.deleted,0)=0order.delete IS NULL or order.delete=0

  • 案例2 ON是两个表加入的条件 条件order.deleted =0在加入

  • 之前被检查(我认为)
  • 案例3 :简单JOIN or INNER JOIN,其中精确行从两侧映射

答案 2 :(得分:0)

让我们有两张桌子

客户

ID  
1   
2   
3   

订单

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

客户3没有任何订单。

当从CUSTOMERORDER完成左连接时,ORDER表中的列对于客户3将为空。因此,如果条件位于where语句,则客户为没有订单将不予退还。如果条件处于“开启”状态,则不会包含这些订单。

答案 3 :(得分:0)

让我具体回答你的问题。

第一个和第三个查询在结果中是相同的,如果不在执行计划中。 where子句正在查看left outer join的第二个表中的字段。第一个表中的任何行而不是第二个表中的任何行都将具有NULL值并被过滤掉。

第二个查询将保留第一个表中的所有行及其所有订单(如果有)。