编写此查询的更好方法是什么?

时间:2012-09-12 13:35:11

标签: sql

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

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'

OR

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子句中,它会有什么不同吗?

2 个答案:

答案 0 :(得分:6)

是的,它会产生很大的不同。

您正在使用左边连接并使其成为内连接,隐藏不是由Mike创建的用户角色

Bell Mike
Toe Mike
Bob Jerry

第一个查询返回

Bell Mike
Toe Mike
Bob NULL

第二个Query返回

Bell Mike
Toe Mike

答案 1 :(得分: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'