SQLでテーブルを結合する際に、INNER JOIN ON TRUE や CROSS JOIN はあまり一般的ではありませんが、理解しておくと便利です。本記事では、両者の違い、重複の可能性、WHERE句との関係、メリット・注意点まで整理します。
- 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行
すべての組み合わせ が返っている
- CROSS JOIN とは
CROSS JOIN は明示的に全組み合わせを作る結合です。
SELECT *
FROM A
CROSS JOIN B;
結果は INNER JOIN ON true と同じ
意図が明確で可読性が高い - INNER JOIN ON TRUE と CROSS JOIN の違い
INNER JOIN ON TRUE
結合条件 TRUE(常に真)
結果 A × B の全組み合わせ
意図 条件なしで結合(珍しい)
可読性 やや不自然
CROSS JOIN
結合条件 なし
結果 A × B の全組み合わせ
意図 全組み合わせを作ることが明確
可読性 自然で理解しやすい
結論:結果は同じだが、意図を示すなら CROSS JOIN が推奨
- WHERE 句との関係
SELECT *
FROM A
INNER JOIN B
ON true
WHERE B.color = 'Red';
WHERE 句は 結合後のフィルタリング
INNER JOIN ON TRUE はあくまで「全組み合わせを作る」目的
この場合、WHERE 句を結合条件代わりに使っており意図が曖昧になってしまってる。
また併せて可読性も下がってる。
SQL 設計上は:
結合条件 → ON
抽出条件 → WHERE
と分けるのが望ましい
-
重複の可能性
CROSS JOIN / INNER JOIN ON TRUE は 全組み合わせを作るため重複行が発生しやすい
例:Aの1行 × Bの複数行 → Aの同じ行が結果に複数回登場
重複を避けたい場合は:
JOIN条件を明示する
DISTINCT を使う(*1)
*1 行数が多い場合、クロス結合(全組み合わせ)や大きなテーブルに対して DISTINCT を使うと 処理コストが非常に高くなる -
CROSS JOIN のメリット
全組み合わせを簡単に作れる
商品 × カラー、日付 × 店舗など
テストやサンプルデータ生成に便利
ダミーデータや組み合わせチェックに活用可能
意図が明確
「全組み合わせを作る」と読んだ人に伝わりやすい
結合条件に依存しない
条件付きの INNER JOIN では不可能なケースにも対応
注意点
行数が爆発的に増える可能性がある
不要に使うとパフォーマンスに悪影響
実務では 必要な場合に限定して使用
まとめ
INNER JOIN ON TRUE は事実上のクロス結合
CROSS JOIN は意図が明確で可読性が高い
WHERE句は結合条件代わりに使わず、抽出条件として分ける
重複行が発生する可能性に注意し、必要に応じて DISTINCT や結合条件を使う