クエリで_CROSS JOIN
_が検出されたときに、クエリで_INNER JOIN
_に安全に置き換えることができるかどうか疑問に思っています。
ON
またはUSING
のない_INNER JOIN
_は_CROSS JOIN
_とまったく同じですか?はいの場合、_CROSS JOIN
_型は、クエリで意図をより適切に表現するためだけに発明されましたか?
この質問の付録は次のようになります。
_CROSS JOIN ... WHERE x
_、INNER JOIN ... ON ( x )
またはINNER JOIN ... WHERE ( x )
を使用する場合、最新の広く使用されているDBMSを使用して違いはありますか?
ありがとうございました。
最近のすべてのデータベースでは、これらの構成要素はすべて同じ計画に最適化されています。
一部のデータベース(SQL Server
など)では、INNER JOIN
の後にON
条件が必要になるため、3番目のクエリはそこで解析されません。
テーブルの可視性スコープはJOIN
の順序であるため、このクエリは次のようになります。
SELECT *
FROM s1
JOIN s2
ON s1.id IN (s2.id, s3.id)
CROSS JOIN
s3
これは解析されませんが、これは:
SELECT *
FROM s2
CROSS JOIN
s3
JOIN s1
ON s1.id IN (s2.id, s3.id)
意志。
生のクロス結合とは、where句のないクロス結合であり、結合される左側のテーブルと右側のテーブルの組み合わせごとに1つのレコードが生成され、左側または右側のデータがない場所にnullが挿入されます。
Where句をクロス結合に追加すると、where句が内部結合のONと同じことを行うため、内部結合と同等になります。
ただし、内部結合を使用すると、ON条件が残りのwhere句から分離されるため、通常は内部結合を使用した方がわかりやすくなります。