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 句に移動したことです。

複数の列で 2 つのテーブルを結合したり、where 句に入れたりすると、違いはありますか?

4

2 に答える 2

6

はい、それは大きな違いを生みます。

左の結合を基本的に無効にし、それを内部の結合にして、Mike によって作成されていないユーザー ロールを非表示にしています。

Bell Mike
Toe Mike
Bob Jerry

最初のクエリが返されます

Bell Mike
Toe Mike
Bob NULL

2 番目のクエリが返す

Bell Mike
Toe Mike
于 2012-09-12T13:38:06.307 に答える
4

はい-それは重要な違いを生みます

結合されたテーブルのフィルターは、正しく機能するために結合に含まれている必要があります。つまり、前者は機能し、2番目は機能しません。

次の(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 に答える