事実上、WHERE
条件とJOIN
[INNER] JOIN
の条件 PostgreSQLでは100%同等です。 (明示的なJOIN
を使用することをお勧めします ただし、クエリを読みやすく、維持しやすくするための条件)。
同じことはない LEFT JOIN
の場合はtrue WHERE
と組み合わせる 結合の右側のテーブルの条件。 LEFT JOIN
の目的 右側の一致に関係なく、結合の左側のすべての行を保持することです。一致するものが見つからない場合、行はNULL
で拡張されます 右側の列の値。マニュアル:
LEFT OUTER JOIN
最初に、内部結合が実行されます。次に、T2のどの行とも結合条件を満たさないT1の各行について、結合された行がT2の列にnull値で追加されます。したがって、結合されたテーブルには、T1の各行に少なくとも1つの行が常にあります。
次に、WHERE
を適用すると NULL
以外のものを必要とする条件 右側のテーブルの列の値を指定すると、効果が無効になり、LEFT [OUTER] JOIN
が強制的に変換されます。 プレーンな[INNER] JOIN
のように機能する 、クエリプランがより複雑なため、(おそらく)より高価になります。
結合されたテーブルが多数あるクエリでは、Postgres(または任意のRDBMS)を使用して、最適な(または適切な)クエリプランを見つけるのは困難です。テーブルを結合するための理論的に可能なシーケンスの数は、階乗増加します。 (!)。 Postgresはタスクに「GenericQueryOptimizer」を使用しており、それに影響を与えるいくつかの設定があります。
誤解を招くLEFT JOIN
でクエリをわかりにくくする 概説したように、クエリプランナーの作業が難しくなり、人間の読者にとって誤解を招き、通常はクエリロジックのエラーを示唆します。
これに起因する問題の関連回答:
- WHEREでnullが整数に等しいのはなぜですか?
- LEFTJOINを使用したクエリがカウント0の行を返さない
- 外部結合を使用し、各親の子レコードを制限するSQLクエリ
- 内側の結合のように機能する左の外側の結合
- 他のテーブルに存在しない行を選択します
など