2

我正在使用 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

4 回答 4

0

让我们给你两张桌子

顾客

ID  
1   
2   
3   

命令

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

客户 3 没有任何订单。

CUSTOMER并且当对表中ORDER的列进行左连接时ORDER,客户 3 将为空。因此,如果条件在 where 语句上,则不会返回没有订单的客户。如果条件为“开”,则不包括这些订单。

于 2012-12-05T20:02:33.683 回答
0

Put them all in a query window in SSMS and type ctrl+l (or turn the option on that shows the actual execution plan after the query runs) and see the plans SQL generates. It will tell you how it's different. SQL will make decisions about queries to make it optimally perform, which can vary depending on your system (i.e. indexes, etc).

Doing a LEFT JOIN may end up with a different execution plan unless SQL can say "hey, you're saying LEFT JOIN but your WHERE clause basically makes it function like an INNER JOIN" and fixes/optimizes things for you.

于 2012-12-05T19:55:57.510 回答
0

我觉得你应该了解一下sql joins。这是一个很好的开始链接。

基本上,

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

  • 案例2ON是两个表正在加入的条件,并且order.deleted =0在加入之前检查了条件(我认为)

  • 案例 3:简单JOIN or INNER JOIN的从两侧映射精确行的地方

于 2012-12-05T20:01:06.807 回答
0

让我具体回答你的问题。

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

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

于 2012-12-05T20:09:11.750 回答