クロス結合は、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はその旨を速やかに通知します。通常彼または彼女は幸せではありません。
さて、これはおそらく質問に答えることはありませんが、それが真実であるなら(そして、私はそれさえ確信していません)、それは楽しい歴史のビットです。
Oracleの初期の頃、開発者の1人は、テーブルのすべての行を複製する必要があることに気付きました(たとえば、イベントのテーブルであり、「開始イベント」と「終了イベント」を別々に変更する必要があった可能性があります。エントリ)。2行だけのテーブルがある場合、クロス結合を実行して、最初のテーブルの列だけを選択し、必要なものを正確に取得できることに気付きました。そこで、彼は単純に「DUAL」と呼ばれるテーブルを作成しました。
後で、アクション自体がテーブルとは関係なくても、テーブルからの選択を介してのみ実行できる何かを実行する必要があります(おそらく彼は時計を忘れて、SELECT SYSDATE FROMを介して時間を読みたかったのです。 。)彼は自分のDUALテーブルがまだ横になっていることに気づき、それを使用しました。しばらくすると、彼は時間が2回出力されるのを見るのに疲れたので、最終的に行の1つを削除しました。
Oracleの他の人たちも彼のテーブルを使い始め、最終的にはそれを標準のOracleインストールに含めることが決定されました。
これが、行が1つしかないことだけが重要であるテーブルに「2」を意味する名前がある理由を説明しています。
キーは、「可能なすべての組み合わせを表示する」です。これらを他の計算フィールドと組み合わせて使用し、それらを並べ替え/フィルタリングしました。
たとえば、裁定取引(取引)アプリケーションを構築しているとします。ある価格で製品を提供する売り手と、ある費用で製品を求める買い手がいます。(潜在的な買い手と売り手を一致させるために)プロダクトキーでクロス結合を行い、コストと価格の間のスプレッドを計算してから、descを並べ替えます。これで、あなた(仲介者)に実行する最も収益性の高い取引を提供します。もちろん、ほとんどの場合、もちろん他の境界フィルター基準があります。
0から9までの数字が10行ある数字テーブルのようなものをとります。そのテーブルでクロスジョインを数回使用して、必要な行数の結果を取得し、結果に適切な番号を付けることができます。これには多くの用途があります。たとえば、それをdatadd()関数と組み合わせて、特定の年の毎日のセットを取得できます。
これは、クロス結合を使用してクロス集計レポートを作成する興味深い方法です。私はJoe CelkoのSQL For Smartiesでそれを見つけて、何度か使っています。少しの設定は必要ですが、時間をかける価値はありました。
CROSS JOINを使用して、次のことを実行できます。-テスト目的でデータを生成します-すべてのプロパティを組み合わせます-たとえば、血液型(A、B、..)とRh-/ +などのすべての可能な組み合わせが必要です... --tune itあなたの目的のために;)-私はこの分野の専門家ではありません;)
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;