0Pricing
Coding Interview Prep · レッスン

CROSS JOINと直積

組み合わせの生成を目的としたCROSS JOINと、行数を意図せず急増させるCROSS JOINを学びます。

「CROSS JOINと直積」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。

面接官が仕掛けるJOIN

CROSS JOINは、左側のテーブルのすべての行と右側のテーブルのすべての行を組み合わせます。ON条件はありません。テーブルAに4行、テーブルBに3行ある場合、結果は4 x 3 = 12行になります。

これは直積と呼ばれます。面接官がこれについて尋ねる理由は2つあります。意図的に組み合わせを生成できるかを確認するためと、結果セットを爆発させる意図しないクロス結合に気づけるかを見るためです。

明示的な CROSS JOIN 構文

デカルト積を記述する、現代的で読みやすい方法は、明示的な CROSS JOIN キーワードを使うことです。ON 句がないことに注目してください。これは意図をレビュアーに明確に伝えます。

ここでは、すべてのサイズとすべての色を組み合わせて、商品バリエーションの完全なマトリックスを作成します。

SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;

古いカンマ構文

デカルト積は、FROM 句にカンマを置き、結合条件を指定しない形でも、今なお記述されます。これは従来のANSI構文です。

CROSS JOIN とまったく同じ結果になりますが、危険です。結合条件を追加するつもりで忘れても、エラーにならず、気付かないままクロス結合になります。明示的な CROSS JOIN を優先してください。

-- Same result as CROSS JOIN, but easy to write by accident
SELECT s.size, c.color
FROM sizes s, colors c;

実例:サイズ表の作成

あるショップが3つのサイズと4色のTシャツを販売しており、まだ在庫にないものも含め、考えられるすべてのバリエーションについて1行ずつ必要だとします。クロス結合を使えば、12通りの組み合わせを1ステップで生成できます。

これは、最も一般的な意図的な用途で、選択肢の完全なグリッドを作成することです。

SELECT s.size, c.color, 0 AS stock_qty
FROM sizes s
CROSS JOIN colors c
ORDER BY s.size, c.color;

カレンダーグリッドの生成

CROSS JOINのもう1つの定番の面接問題での用途は、データが欠落していてもすべての組み合わせが存在する密なグリッドを作成することです。

ここではすべての店舗とすべての日付をクロス結合します。その後、売上に対して LEFT JOIN すると、店舗と日ごとに1行ずつ得られ、欠落部分は0で埋められます。クロス結合により、店舗と日の組み合わせが1つも抜けないことが保証されます。

SELECT st.store_id, d.day
FROM stores st
CROSS JOIN calendar d
WHERE d.day BETWEEN DATE '2024-01-01' AND DATE '2024-01-31';

意図しないデカルト積の爆発

面接官が確認する危険なパターンは、2つのテーブルを結合したのに結合条件を忘れることです。エラーになる代わりに、データベースはすべての組み合わせを問題なく返します。

orders に100,000行、customers に50,000行ある場合、結果は50億行になります。クエリは終わらず、メモリを使い果たし、数値は大幅に膨れ上がります。コードレビューでこのパターンに気付けることは、理解が確かな証拠です。

-- BUG: no join condition between the two tables
SELECT o.order_id, c.name
FROM orders o, customers c;
-- returns COUNT(orders) * COUNT(customers) rows

意図しないクロス結合を見抜く方法

面接官が挙げることを期待する症状:

  • 行数が2つのテーブルサイズの積におおよそ等しく、合計ではありません。
  • SUM のような集計値が一定の倍率で膨れ上がります。
  • クエリプランに、結合フィルターのない Nested Loop が表示されます。

修正方法は、ほぼ常にテーブル間の ON または WHERE の等価条件が欠けていることです。

常に真になる ON を指定した CROSS JOIN と INNER JOIN の比較

CROSS JOIN は、論理的には INNER JOIN ... ON 1=1 と同一です。どちらも完全なデカルト積を生成します。

実際、内部結合とは、ON 条件でフィルタリングする前のクロス結合にすぎません。このメンタルモデルを使うと、条件がない場合に内部結合がクロス結合へと変わる理由を理解できます。

-- These two queries return identical results
SELECT * FROM a CROSS JOIN b;
SELECT * FROM a INNER JOIN b ON 1 = 1;

numbers テーブルとのクロス結合

強力なテクニックとして、小さな numbers または generate_series テーブルに対してクロス結合を行い、意図的に行数を増やします。これは1行を複数行に展開する場合に使います。たとえば、数量を単位ごとの行に変換できます。

ここでは、数列に結合して数量以下の数値だけを残すことで、各商品行を qty 回繰り返します。

SELECT p.product_id, n.n AS unit_number
FROM products p
CROSS JOIN generate_series(1, 100) AS n(n)
WHERE n.n <= p.qty;

パフォーマンスと安全な使い方

出力は乗算的に増えるため、2つの大きなテーブルを決してクロス結合しないでください。少なくとも一方は小さく、上限が明確なもの(サイズの一覧、小さなカレンダー、numbers テーブル)にしてください。

面接では、これを明確に述べてください:「CROSS JOIN が安全なのは、一方のテーブルが小さく、上限が明確な場合に限られます。それ以外では結果を扱いきれません。」 この一文は、単なる構文知識ではなく、判断力があることを示します。

CROSS JOIN を使う場面

2つの集合のすべての組み合わせが必要な場合は、意図的に CROSS JOIN を使用します:

  • 選択肢のマトリックスを生成する(サイズ×色)。
  • LEFT JOIN の前に時系列を密にする(店舗×日付)。
  • numbers テーブルを使って行を展開する。

すべての組み合わせが必要でないなら、ほぼ確実に、代わりに ON 条件を指定した結合を使うべきです。

理解度チェック

デカルト積について理解度を確認します。

まとめ:CROSS JOIN

要点:

  • CROSS JOIN は左側の各行を右側のすべての行と組み合わせます。出力サイズは入力の積です。
  • 条件のないカンマ構文は同じデカルト積を生成しますが、多くの場合、意図せず発生します。
  • 組み合わせのグリッド、時系列の密化、numbers テーブルを使った行の展開に意図的に使用します。
  • ON がない内部結合は、気付かないうちにクロス結合へ変わります。これは面接官が好んで出す、行数が爆発するバグです。

よくある質問

「CROSS JOINと直積」レッスンは無料ですか?

はい。「CROSS JOINと直積」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。

「CROSS JOINと直積」で何を学びますか?

組み合わせの生成を目的としたCROSS JOINと、行数を意図せず急増させるCROSS JOINを学びます。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Coding Interview Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「CROSS JOINと直積」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCoding Interview Prepレッスンでコードを書いて実行できますか?

はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. CROSS JOINと直積
  2. 階層構造のためのSELF JOIN
  3. 1つのテーブル内で行を比較する
  4. 適切なJOINの種類を選ぶ
← Coding Interview Prepに戻る