我正在使用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
答案 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
,因为它可能是null
是right table of a left join
。如果右表没有映射行,则该表中的列将为空。它应该是ISNULL(order.deleted,0)=0
或order.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没有任何订单。
当从CUSTOMER
到ORDER
完成左连接时,ORDER
表中的列对于客户3将为空。因此,如果条件位于where语句,则客户为没有订单将不予退还。如果条件处于“开启”状态,则不会包含这些订单。
答案 3 :(得分:0)
让我具体回答你的问题。
第一个和第三个查询在结果中是相同的,如果不在执行计划中。 where
子句正在查看left outer join
的第二个表中的字段。第一个表中的任何行而不是第二个表中的任何行都将具有NULL值并被过滤掉。
第二个查询将保留第一个表中的所有行及其所有订单(如果有)。