web-dev-qa-db-ja.com

CROSS JOINはON句のないINNER JOINの同義語ですか?

クエリで_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を使用して違いはありますか?

ありがとうございました。

28
Benoit

最近のすべてのデータベースでは、これらの構成要素はすべて同じ計画に最適化されています。

一部のデータベース(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)

意志。

22
Quassnoi

生のクロス結合とは、where句のないクロス結合であり、結合される左側のテーブルと右側のテーブルの組み合わせごとに1つのレコードが生成され、左側または右側のデータがない場所にnullが挿入されます。

Where句をクロス結合に追加すると、where句が内部結合のONと同じことを行うため、内部結合と同等になります。

ただし、内部結合を使用すると、ON条件が残りのwhere句から分離されるため、通常は内部結合を使用した方がわかりやすくなります。

2
Chris Snowden