2017-02-21 20 views
0

私はこのクエリがある場合:MYSQL - 使用とでは、対JOINのWHERE句

select * from tableA 
left outer join tableB on tableA.id=tableB.id 
where tableA.owner=10 
AND tableB.foo = 1 

I:

select * from tableA 
left outer join tableB on tableA.id=tableB.id 
AND tableB.foo = 1 
where tableA.owner=10 

が、私は29件の結果を得るが、私はそれを移動した場合、ANDをWHERE句のようにわずか17の結果しか得られません。

私はJOINとWHERE節の間でANDの使い方がどのように異なっているかについて明確なガイドを見つけることができません。誰も私にこれを説明することはできますか?

また、私がのJOINのようなことをすると、テーブル内のnullでない場合でも、すべてのtableB.fooフィールドがクエリ結果にNULLになります。 JOIN句にANDを指定すると、WHERE句でフィルタリングされる前にFROM選択項目のそのフィールドが変更されますか?

+0

ここでは、http://stackoverflow.com/a/15706298/7416478を見ることができます。 –

答えて

1

外部結合するテーブルの条件はすべて、最初のクエリと同様にJOIN句にする必要があります。 2番目のクエリのようにWHERE句に入れると、OUTER JOINが暗黙的にINNER JOINに変換されます。

AND tableB.foo = NULLについてのご質問は、適切なMySQL構文ではありません。 NULLはIS NULLのような演算子を使用してspecial treatmentが必要です。代わりにAND tableB.foo IS NULLを使用してください。

1

外部結合は、内部結合と同じになります。さらに、レコードの一致がない場合、すべての列がnullに設定されたダミーレコードが結合されます(結果的に、結果の最初のテーブルから行が取得されます)。

最初のクエリでは、同じIDとfoo = 1を持つtableBの一致を探しています。このような一致がないtableAのレコードに対しては、結果行(すべてのtableAフィールドがnullの場合)が表示されます。

2番目のクエリでは、同じIDを持つtableBの一致を探しています。このような一致がないtableAのレコードでは、結果行(すべてのtableAフィールドがnullの場合)が表示されます。 where句では、foo = 1の行しか保持しません。これは(fooがnullであるため)外部結合されたレコードをすべて破棄し、プレーンな内部結合であったはずです。

したがって、常にON句の外部結合テーブルにすべての条件を設定します。 (ただし、1つの例外はありますが、アンチ・ジョイントは別の時間にそのパターンを知ることができます)。

関連する問題