質問

クロス結合は、2 つのセットのタプルに対してデカルト積を実行します。

SELECT *
FROM Table1
CROSS JOIN Table2

このような SQL 操作が特に役立つのはどのような状況ですか?

役に立ちましたか?

解決

「グリッド」がある場合特定の衣料品のサイズや色の情報など、完全に入力すること:

select 
    size,
    color
from
    sizes CROSS JOIN colors

1日の1分ごとに1行を含むテーブルが必要な場合があり、それを使用してプロシージャが1分ごとに実行されたことを確認するため、3つのテーブルにまたがる場合があります:

select
    hour,
    minute
from
    hours CROSS JOIN minutes

または、年間の各月に適用する標準レポート仕様のセットがある場合:

select
    specId,
    month
from
    reports CROSS JOIN months

これらをビューとして維持することの問題は、ほとんどの場合、特に衣服に関して、完全な製品を望んでいないことです。クエリに MINUS ロジックを追加して、持ち運びできない特定の組み合わせを削除できますが、デカルト積を使用せずに他の方法でテーブルにデータを追加する方が簡単な場合があります。

また、おそらくあなたが考えていたよりも数行多いテーブルでクロス結合を試みたり、おそらく WHERE 句が部分的または完全に欠落したりするかもしれません。その場合、DBAはすぐに漏れを通知します。通常、彼または彼女は幸せではありません。

他のヒント

通常、ほとんどのデータベースクエリに対して完全なデカルト積が必要になることはありません。リレーショナルデータベースの全機能は、興味のある制限を適用して、dbから不要な行をプルしないようにすることができることです。

従業員のテーブルと実行が必要なジョブのテーブルがあり、1人の従業員の1つのジョブへのすべての可能な割り当てを確認したい場合、それが必要になる可能性のある不自然な例だと思います。

テスト用のデータを生成します。

はい、おそらくこれは質問に答えませんが、もしそれが本当なら(そして私もそれを確信していなければ)それは楽しい歴史です。

Oracleの初期の頃、開発者の1人は、テーブル内のすべての行を複製する必要があることに気付きました(たとえば、イベントのテーブルである可能性があり、「開始イベント」を個別に変更する必要があり、 「イベント終了」エントリ)。彼は、2行だけのテーブルがある場合、最初のテーブルの列だけを選択してクロスジョインを実行し、必要なものを正確に取得できることに気付きました。そこで彼は単純なテーブルを作成しましたが、当然「DUAL」と呼ばれていました。

その後、アクション自体はテーブルとは関係ありませんが、テーブルからの選択を介してしか実行できないことを行う必要があります(おそらく、彼は時計を忘れて、SELECT SYSDATEで時刻を読みたいと考えていたのでしょう) FROM ...)彼は、まだ自分のDUALテーブルが横になっていることに気付き、それを使用しました。しばらくして、時間を2回印刷するのにうんざりしたため、最終的に行の1つを削除しました。

Oracleの他の人は彼のテーブルの使用を開始し、最終的には標準のOracleインストールに含めることが決定されました。

唯一の重要性を持つテーブルに1つの行があるという理由は、「2」を意味する名前を持つ理由を説明しています。

重要なのは「可能な組み合わせをすべて見せてください」ということです。これらを他の計算フィールドと組み合わせて使用​​し、並べ替え/フィルター処理しました。

たとえば、アービトラージ (取引) アプリケーションを構築しているとします。売り手は価格で製品を提供し、買い手は価格で製品を要求します。プロダクト キーでクロス結合を実行し (潜在的な購入者と販売者を照合するため)、コストと価格のスプレッドを計算して、記述を並べ替えます。これに基づいて、あなた(仲介者)に最も収益性の高い取引を実行させることができます。もちろん、ほとんどの場合、他の境界フィルター基準があります。

数字テーブルのようなものを取ります。数字テーブルには、数字0〜9の10行があります。そのテーブルでクロスジョインを数回使用して、必要な行数があり、結果に適切な番号が付けられた結果を取得できます。これには多くの用途があります。たとえば、それをdatadd()関数と組み合わせて、特定の年の毎日のセットを取得できます。

これは、クロス集計レポートを作成 Joe CelkoのSQL For Smarties で見つけて、何度か使用しています。少しセットアップが必要ですが、時間を費やす価値があります。

アイテムと日付の特定の組み合わせ(価格、在庫状況など)に対して発行する一連のクエリがあるとします。アイテムと日付を別々の一時テーブルにロードし、クエリをテーブルにクロス結合させることができます。特に一部のデータベースではIN句の要素数が制限されているため、これはIN句で項目と日付を列挙する代替手段よりも便利な場合があります。

これを使用して、クロスジョインすることができます。 -テスト目的のデータを生成する -すべてのプロパティを組み合わせます-たとえば、血液型(A、B、..)とRh-/ +などのすべての可能な組み合わせが必要です。 -目的に合わせて調整します;)-私はこの分野の専門家ではありません;)

CREATE TABLE "HR"."BL_GRP_01" 
("GR_1" VARCHAR2(5 BYTE));
REM INSERTING into BL_GRP_01
SET DEFINE OFF;
Insert into BL_GRP_02 (GR_1) values ('A');
Insert into BL_GRP_02 (GR_1) values ('B');
Insert into BL_GRP_02 (GR_1) values ('O');
Insert into BL_GRP_01 (GR_1) values (NULL);

CREATE TABLE "HR"."BL_GRP_02" 
("GR_1" VARCHAR2(5 BYTE));

REM INSERTING into BL_GRP_02
SET DEFINE OFF;
Insert into BL_GRP_02 (GR_1) values ('A');
Insert into BL_GRP_02 (GR_1) values ('B');
Insert into BL_GRP_02 (GR_1) values ('O');
Insert into BL_GRP_02 (GR_1) values (NULL);

CREATE TABLE "HR"."RH_VAL_01" 
("RH_VAL" VARCHAR2(5 BYTE));
REM INSERTING into RH_VAL_01
SET DEFINE OFF;
Insert into RH_VAL_01 (RH_VAL) values ('+');
Insert into RH_VAL_01 (RH_VAL) values ('-');
Insert into RH_VAL_01 (RH_VAL) values (NULL);

select distinct  a.GR_1 || b.GR_1 || c.RH_VAL as BL_GRP
from BL_GRP_01 a, BL_GRP_02 b, RH_VAL_01 c
GROUP BY a.GR_1, b.GR_1, c.RH_VAL;
  • 共通のIDなしで2つのテーブルの結合を作成し、max()などを使用してグループ化して、可能な限り最高の組み合わせを見つけます
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top