クロス結合は、2 つのセットのタプルに対してデカルト積を実行します。
SELECT *
FROM Table1
CROSS JOIN Table2
このような SQL 操作が特に役立つのはどのような状況ですか?
クロス結合は、2 つのセットのタプルに対してデカルト積を実行します。
SELECT *
FROM Table1
CROSS JOIN Table2
このような SQL 操作が特に役立つのはどのような状況ですか?
特定の衣料品のサイズや色の情報など、完全に入力する「グリッド」がある場合:
select
size,
color
from
sizes CROSS JOIN colors
1日の毎分ごとの行を含むテーブルが必要であり、それを使用してプロシージャが毎分実行されたことを確認したい場合は、次の3つのテーブルをまたがることができます。
select
hour,
minute
from
hours CROSS JOIN minutes
または、その年の毎月適用する一連の標準レポート仕様があります。
select
specId,
month
from
reports CROSS JOIN months
これらをビューとして維持することの問題は、ほとんどの場合、特に衣服に関して、完全な製品を望まないことです。クエリにロジックを追加MINUS
して、持っていない特定の組み合わせを削除することもできますが、デカルト積を使用せずに、別の方法でテーブルにデータを入力する方が簡単な場合があります。
また、おそらく予想よりも数行多いテーブルでクロス結合を試行することになる可能性があります。または、WHERE
句が部分的または完全に欠落している可能性があります。その場合、DBAはその省略を速やかに通知します。通常、彼または彼女は幸せではありません。
テスト用のデータを生成します。
通常、ほとんどのデータベースクエリで完全なデカルト積は必要ありません。リレーショナルデータベースの全体的な力は、データベースから不要な行を取得しないようにするために、関心のある制限を適用できることです。
従業員のテーブルと、実行する必要のあるジョブのテーブルがあり、1人の従業員から1つのジョブへのすべての可能な割り当てを確認したい場合は、1つの不自然な例が必要になると思います。
わかりました、これはおそらく質問に答えませんが、それが本当なら(そして私はそれさえ確信が持てません)、それは楽しい歴史です。
Oracleの初期の頃、開発者の1人は、テーブル内のすべての行を複製する必要があることに気付きました(たとえば、イベントのテーブルである可能性があり、「開始イベント」と「終了イベント」を別々に変更する必要がありました。エントリ)。彼は、2行しかないテーブルがある場合、最初のテーブルの列だけを選択してクロス結合を実行し、必要なものを正確に取得できることに気付きました。そこで彼は、当然「DUAL」と呼ばれる単純なテーブルを作成しました。
後で、アクション自体はテーブルとは何の関係もありませんでしたが、テーブルからの選択を介してのみ実行できることを行う必要があります(おそらく、彼は時計を忘れて、SELECTSYSDATEFROMを介して時刻を読みたいと思っていました。 。)彼はまだ自分のDUALテーブルが横になっていることに気づき、それを使用しました。しばらくすると、彼は時間が2回印刷されるのを見るのにうんざりしていたので、最終的に1つの行を削除しました。
Oracleの他のメンバーは彼のテーブルを使い始め、最終的には標準のOracleインストールに含めることが決定されました。
これが、1行しかないという唯一の意味を持つテーブルに、「2」を意味する名前が付けられている理由を説明しています。
重要なのは、「考えられるすべての組み合わせを表示する」ことです。これらを他の計算フィールドと組み合わせて使用し、それらをソート/フィルタリングしました。
たとえば、アービトラージ (取引) アプリケーションを構築しているとします。価格で製品を提供する売り手と、コストで製品を要求する買い手がいます。プロダクト キーを相互結合し (潜在的な買い手と売り手を一致させるため)、コストと価格の差を計算し、降順で並べ替えます。これにより、あなた(仲介者)に最も収益性の高い取引を実行できます。もちろん、ほとんどの場合、他の境界フィルター基準があります。
0 ~ 9 の数字に対して 10 行の数字テーブルのようなものを取ります。そのテーブルでクロス結合を数回使用して、必要な数の行を持つ結果を取得し、結果に適切な番号を付けることができます。これには多くの用途があります。たとえば、これを dataadd() 関数と組み合わせて、特定の年の毎日のセットを取得できます。
これは、クロス結合を使用してクロス集計レポートを作成する興味深い方法です。Joe Celko の SQL For Smartiesで見つけ、何度か使用しました。少しセットアップが必要ですが、投資する価値はあります。
アイテムと日付(価格、在庫状況など)の特定の組み合わせに対して発行したい一連のクエリがあるとします。アイテムと日付を別々の一時テーブルにロードして、クエリをテーブルに相互結合させることができます。これは、IN句の項目と日付を列挙する代わりの方法よりも便利な場合があります。特に、一部のデータベースではIN句の要素数が制限されているためです。
CROSS JOINを使用して、次のことができます。
CREATE TABLE BL_GRP_01 (GR_1 text);
CREATE TABLE RH_VAL_01 (RH_VAL text);
INSERT INTO BL_GRP_01 VALUES ('A'), ('B'), ('AB'), ('O');
INSERT INTO RH_VAL_01 VALUES ('+'), ('-');
SELECT CONCAT(x.GR_1, y.RH_val)
FROM BL_GRP_01 x
CROSS JOIN RH_VAL_01 y
ORDER BY CONCAT(x.GR_1, y.RH_VAL);