0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

INNER JOIN ON TRUE と CROSS JOIN の違い・メリット・注意点まとめ

Posted at

SQLでテーブルを結合する際に、INNER JOIN ON TRUE や CROSS JOIN はあまり一般的ではありませんが、理解しておくと便利です。本記事では、両者の違い、重複の可能性、WHERE句との関係、メリット・注意点まで整理します。

  1. INNER JOIN ON TRUE とは
    通常、INNER JOIN は結合条件に基づき、両テーブルでマッチする行のみを抽出します。
    SELECT *
    FROM A
    INNER JOIN B
    ON A.id = B.a_id;
    しかし、条件を TRUE にすると:
    SELECT *
    FROM A
    INNER JOIN B
    ON true;
    条件が常に真なので、Aの各行 × Bの全行 の全組み合わせが返る
    事実上、クロス結合(CROSS JOIN)と同じ結果になる

2(Aの行) × 2(Bの行) = 4行
すべての組み合わせ が返っている

  1. CROSS JOIN とは
    CROSS JOIN は明示的に全組み合わせを作る結合です。
    SELECT *
    FROM A
    CROSS JOIN B;
    結果は INNER JOIN ON true と同じ
    意図が明確で可読性が高い
  2. INNER JOIN ON TRUE と CROSS JOIN の違い

INNER JOIN ON TRUE
結合条件 TRUE(常に真)
結果 A × B の全組み合わせ
意図 条件なしで結合(珍しい)
可読性 やや不自然

CROSS JOIN
結合条件 なし
結果 A × B の全組み合わせ
意図 全組み合わせを作ることが明確
可読性 自然で理解しやすい

結論:結果は同じだが、意図を示すなら CROSS JOIN が推奨

  1. WHERE 句との関係
    SELECT *
    FROM A
    INNER JOIN B
    ON true
    WHERE B.color = 'Red';
    WHERE 句は 結合後のフィルタリング
    INNER JOIN ON TRUE はあくまで「全組み合わせを作る」目的
    この場合、WHERE 句を結合条件代わりに使っており意図が曖昧になってしまってる。
    また併せて可読性も下がってる。

SQL 設計上は:
結合条件 → ON
抽出条件 → WHERE
と分けるのが望ましい

  1. 重複の可能性
    CROSS JOIN / INNER JOIN ON TRUE は 全組み合わせを作るため重複行が発生しやすい
    例:Aの1行 × Bの複数行 → Aの同じ行が結果に複数回登場
    重複を避けたい場合は:
    JOIN条件を明示する
    DISTINCT を使う(*1)
    *1 行数が多い場合、クロス結合(全組み合わせ)や大きなテーブルに対して DISTINCT を使うと 処理コストが非常に高くなる

  2. CROSS JOIN のメリット
    全組み合わせを簡単に作れる
    商品 × カラー、日付 × 店舗など
    テストやサンプルデータ生成に便利
    ダミーデータや組み合わせチェックに活用可能
    意図が明確
    「全組み合わせを作る」と読んだ人に伝わりやすい
    結合条件に依存しない
    条件付きの INNER JOIN では不可能なケースにも対応

注意点
行数が爆発的に増える可能性がある
不要に使うとパフォーマンスに悪影響
実務では 必要な場合に限定して使用

まとめ
INNER JOIN ON TRUE は事実上のクロス結合
CROSS JOIN は意図が明確で可読性が高い
WHERE句は結合条件代わりに使わず、抽出条件として分ける
重複行が発生する可能性に注意し、必要に応じて DISTINCT や結合条件を使う

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?