次の2つの例があります。
1.例(WHERE)
SELECT 1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id
WHERE t2.field = true
2.例(JOIN AND)
SELECT 1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id AND t2.field = true
パフォーマンスの面でより速い方法は何ですか?あなたは何を好むか?
フィルタがJOIN機能的に条件に入った場合(つまり、フィルタだけでなく実際の結合条件である場合)、ONその結合の句に含まれている必要があります。
注目に値する:
代わりにWHERE句に配置すると、結合がの場合はパフォーマンスが同じになりINNER、それ以外の場合はパフォーマンスが異なります。コメントで述べたように、とにかく結果が異なるので、それは実際には重要ではありません。
WHERE本当に条件であるときに句にフィルターを配置すると、OUTER JOIN条件の性質が暗黙的にキャンセルOUTERされます(「レコードがない場合でも参加する」)。これらのフィルターは、そもそも既存のレコードが存在する必要があることを意味します。例:
... table1 t LEFT JOIN table2 u ON ... AND t2.column = 5正しい
... table1 t LEFT JOIN table2 u ON ...
WHERE t2.column = 5
t2からのレコードが予期されていることをエンジンに通知するため、これは正しくありませt2.column = 5ん。これは外部結合に反します。これに対する例外は、次IS NULLのようなフィルターWHERE t2.column IS (NOT) NULLです(これは、実際には条件付き外部結合を構築するための便利な方法です)
LEFTRIGHT結合は暗黙的にOUTER結合です。お役に立てば幸いです。
JOIN通常、条件はフィルター条件から独立している必要があります。結合のルール(how)を。で定義しますON。必要なものをでフィルタリングしますWHERE。パフォーマンスに関しては、すべてのエンジンとデザインに共通のルールはないため、走行距離は大きく異なります。
より高速な方法は、フィルターをwhere句に配置することです。これは、フィルターをwhereで最初に、次に結合句で処理するため、フィルターを並べ替える必要がないためです。