Frage

Ein Cross-Join führt eine kartesische Produkt auf den Tupeln der beiden Sätze.

SELECT *
FROM Table1
CROSS JOIN Table2

Welche Umstände machen eine solche SQL-Operation besonders nützlich?

War es hilfreich?

Lösung

Wenn Sie ein „Raster“, die Sie vollständig ausfüllen mögen, wie Größe und Farbinformationen für einen bestimmten Artikel von Kleidung:

select 
    size,
    color
from
    sizes CROSS JOIN colors

Vielleicht möchten Sie eine Tabelle, die eine Zeile für jede Minute in den Tag enthält, und Sie wollen, es zu benutzen, um zu überprüfen, dass ein Verfahren jede Minute ausgeführt hat, so dass Sie vielleicht drei Tabellen kreuzen:

select
    hour,
    minute
from
    hours CROSS JOIN minutes

Oder Sie haben eine Reihe von Standard-Report-Spezifikationen, die Sie jeden Monat im Jahr angewandt werden sollen:

select
    specId,
    month
from
    reports CROSS JOIN months

Das Problem diese als Ansichten mit der Aufrechterhaltung ist, dass in den meisten Fällen Sie nicht ein komplettes Produkt wünschen, vor allem in Bezug auf Kleidung. Sie können MINUS Logik zu der Abfrage hinzufügen bestimmte Kombinationen zu entfernen, die Sie nicht tragen, aber man könnte es einfacher füllen eine Tabelle eine andere Art und Weise und nicht ein Kartesisches Produkt verwenden kann.

Auch könnte man das Kreuz auf den Tischen kommen am Ende versuchen, die vielleicht ein paar mehr Zeilen haben, als Sie dachten, oder vielleicht Ihre WHERE Klausel war teilweise oder vollständig fehlt. In diesem Fall wird Ihr DBA Sie unverzüglich über den Wegfall benachrichtigen. Normalerweise wird er oder sie nicht glücklich sein.

Andere Tipps

Sie sind normalerweise nicht zu einem vollständigen Kartesisches Produkt für die meisten Datenbankabfragen werden soll. Die gesamte Leistung von relationalen Datenbanken ist, dass Sie, was Einschränkungen können Sie von Interesse sein könnten, damit Sie unnötige Zeilen aus der db ziehen zu vermeiden.

Ich nehme an ein konstruiertes Beispiel, wo Sie wollen, dass könnte, ist, wenn Sie eine Tabelle der Mitarbeiter und eine Tabelle der Arbeitsplätze, die alle möglichen Aufgaben eines Mitarbeiters zu einem Auftrag sehen, müssen tun und wollen.

generieren Daten für den Test.

Ok, das wird wohl die Frage nicht beantworten, aber, wenn es wahr ist (und ich bin nicht einmal sicher, dass) es ist ein Spaß wenig Geschichte.

In den frühen Tagen von Oracle, einer der Entwickler klar, dass er benötigt jede Zeile in einer Tabelle (zum Beispiel zu duplizieren, ist es möglich, es eine Tabelle der Ereignisse war und er brauchte, um es „Start-Event“ zu ändern trennen und " Ende Ereignis“Einträge). Er erkannte, dass, wenn er mit nur zwei Reihen hatte einen Tisch, er ist ein Cross-Join tun kann, nur die Spalten in der ersten Tabelle auswählen und genau das bekommt, hatte er brauchte. So schuf er eine einfache Tabelle, die er natürlich genug genannt „DUAL“.

Später, er braucht etwas zu tun, die nur über einen ausgewählten aus einer Tabelle durchgeführt werden könnten, auch wenn die Handlung selbst nichts mit der Tabelle zu tun hatte, (vielleicht vergaß er seine Uhr und wollte die Zeit über SELECT SYSDATE lesen FROM ...) er erkannte, dass er immer noch seine DUAL Tisch herumliegen hatte, und verwendet das. Nach einer Weile, er müde die Zeit des Sehens zweimal gedruckt, so dass er gelöscht schließlich eine der Zeilen.

Andere bei Oracle begannen seine Tabelle, und schließlich wurde beschlossen, es in der Standard-Oracle-Installation enthalten.

Dies erklärt, warum eine Tabelle, deren einzige Bedeutung ist, dass es eine Zeile hat einen Namen hat, was bedeutet, „zwei“.

Der Schlüssel ist „Zeige mir alle möglichen Kombinationen“. Ich habe diese in Verbindung mit anderen berechneten Feldern verwendet, um ein dann sortiert / gefiltert diejenigen.

Zum Beispiel, sagen Sie bauen eine Arbitrage (Handel) Anwendung. Sie haben Verkäufer Produkte zu einem Preis anbieten und Käufer zu einem Preis für Produkte zu stellen. Sie ein Kreuz auf dem Produktschlüssel verbinden (um die potenziellen Käufer und Verkäufer zusammenpassen), die Berechnung die Differenz zwischen Kosten und Preis, dann sortieren ab. auf diese Sie (der Vermittler) die profitabelsten Trades geben auszuführen. Fast immer werden Sie andere Begrenzungsfilterkriterien natürlich haben.

nimmt so etwas wie ein Ziffern-Tabelle, die 0-9 zehn Zeilen für die Ziffern hat. Sie können ein paar Mal Cross-Join verwenden, um auf diese Tabelle zu einem get Ergebnis, das jedoch viele Zeilen, die Sie benötigen, wobei die Ergebnisse in geeigneter Weise nummeriert. Dies hat eine Reihe von Anwendungen. Zum Beispiel, können Sie es mit einer datadd () Funktion erhalten einen Satz für jeden Tag in einem bestimmten Jahr kombinieren.

Das ist ein interessanter Weg, um ein Cross-Join zu erstellen Kreuztabellen- Bericht . Ich fand es in Joe Celko SQL für Smarties , und haben es mehrmals verwendet. Es tut ein wenig Setup nehmen, aber war die Zeit wert investiert.

Stellen Sie sich eine Reihe von Abfragen Sie haben eine spezielle Kombination von Elementen zur Ausgabe über wollen und Daten (Preise, Verfügbarkeit, etc ..). Sie könnten die Elemente und Daten in separate temporären Tabellen laden und Ihre Fragen haben überqueren die Tabellen verbinden. Dies kann bequemer sein als die Alternative der Elemente und Daten in IN-Klauseln aufzählt, zumal einige Datenbanken die Anzahl der Elemente in einer IN-Klausel begrenzen.

Sie können es verwenden, CROSS JOIN : - erzeugen Daten für Prüfzwecke vereinen alle Eigenschaften - - Sie müssen alle möglichen Kombinationen von beispielsBlutGruppen (A, B, ..) mit Rh - / +, etc ... - stimmen Sie es für Ihre Zwecke;) - Ich bin kein Experte auf diesem Gebiet;)

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;
  • erstellen ohne eine gemeinsame ID für zwei Tabellen verbinden und dann die Gruppe es max () verwendet, etc .. höchstmögliche Kombination finden
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top