4

我有一个简单的连接查询,如下所示。

select * 
from user u left join 
     user_roles ur 
     on  ur.user_id = u.user_id 
     and ur.created_by = 'Mike'
where u.division = 'some division'

或者

select * 
from user u left join 
     user_roles ur 
     on  ur.user_id = u.user_id 
where u.division = 'some division' 
and   ur.created_by = 'Mike'

重点是我已将附加过滤子句条件从左连接移至 where 子句。

如果我在多列上加入两个表或将其放在 where 子句中,会有什么不同吗?

4

2 回答 2

6

是的,它有很大的不同。

您基本上取消了左连接并使其成为内部连接,隐藏了不是由 Mike 创建的用户角色

Bell Mike
Toe Mike
Bob Jerry

第一个查询返回

Bell Mike
Toe Mike
Bob NULL

第二个查询返回

Bell Mike
Toe Mike
于 2012-09-12T13:38:06.307 回答
4

是的 - 它有重要的不同

连接表上的任何过滤器都应该在连接中以使其正常工作 - 即:前者将工作,第二个则不会。

尝试以下(SQL Server 语法)以查看结果有何不同

declare @u table (user_id int, division varchar(20))
declare @ur table (user_id int, created_by varchar(10))

insert @u values (1,'sales'), (2,'marketing'), (3,'engineering')

insert @ur values (1, 'mike'), (3,'james'), (3,'mike')

select * from @u u  
left join @ur ur on ur.user_id = u.user_id and ur.created_by = 'Mike' 

select * from @u u  
left join @ur ur on ur.user_id = u.user_id 
where ur.created_by = 'Mike' 
于 2012-09-12T13:37:29.813 回答