web-dev-qa-db-ja.com

SQL JOIN WHERE条件をどこに配置しますか?

次の2つの例があります。

1。例(WHERE)

SELECT 1
  FROM table1 t1
  JOIN table2 t2 ON t1.id = t2.id
 WHERE t2.field = true

2。例(結合AND)

SELECT 1
  FROM table1 t1
  JOIN table2 t2 ON t1.id = t2.id AND t2.field = true

パフォーマンスの面でより速い方法は何ですか?あなたは何を好むか?

30
Aley

フィルタがJOIN条件に機能的に入力する場合(つまり、フィルタではなく実際の結合条件である場合)、その結合のON句に表示する必要があります。

注目に値する:

  • 代わりにWHERE句に配置すると、結合がINNERである場合のパフォーマンスは同じですが、そうでない場合は異なります。コメントで述べたように、とにかく結果が異なるので、それは本当に重要ではありません。

  • 本当にOUTER JOIN条件である場合にWHERE句にフィルターを配置すると、OUTER条件の性質が暗黙的にキャンセルされます(「レコードがない場合でも結合」)そもそも。例:

... table1 t LEFT JOIN table2 u ON ... AND t2.column = 5は正しい

... table1 t LEFT JOIN table2 u ON ... 
WHERE t2.column = 5 

t2.column = 5はt2からのレコードが予期されていることをエンジンに通知するため、これは正しくありません。これは外部結合に反します。これの例外は、WHERE t2.column IS (NOT) NULLなどのIS NULLフィルターです(実際には条件付き外部結合を構築する便利な方法です)

  • LEFTおよびRIGHT結合は、暗黙的にOUTER結合です。

お役に立てば幸いです。

17
Sebas

JOIN条件は通常、フィルター条件から独立している必要があります。結合のルール(how)をONで定義します。 WHEREを使用してwhatをフィルタリングします。パフォーマンスに関しては、すべてのエンジンとデザインに一般的なルールはないため、走行距離は大きく異なります。

6
MPelletier

より高速な方法は、where句にフィルタを配置することだと思います。where句でフィルタを処理し、次にjoin句で処理するため、フィルタの置換は不要です。

0
Artemination