我有一个简单的连接查询,如下所示。
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子句中,它会有什么不同吗?
答案 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'