次の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
パフォーマンスの面でより速い方法は何ですか?あなたは何を好むか?
フィルタが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
結合です。お役に立てば幸いです。
JOIN
条件は通常、フィルター条件から独立している必要があります。結合のルール(how)をON
で定義します。 WHERE
を使用してwhatをフィルタリングします。パフォーマンスに関しては、すべてのエンジンとデザインに一般的なルールはないため、走行距離は大きく異なります。
より高速な方法は、where句にフィルタを配置することだと思います。where句でフィルタを処理し、次にjoin句で処理するため、フィルタの置換は不要です。