SQL Server: Was ist der Unterschied zwischen CROSS JOIN und FULL OUTER JOIN?


Antworten:


243

Eine Kreuzverknüpfung erzeugt ein kartesisches Produkt zwischen den beiden Tabellen und gibt alle möglichen Kombinationen aller Zeilen zurück. Es gibt keine onKlausel, weil Sie einfach alles mit allem verbinden.

A full outer joinist eine Kombination aus a left outerund right outerjoin. Es gibt alle Zeilen in beiden Tabellen zurück, die mit der whereKlausel der Abfrage übereinstimmen , und in Fällen, in denen die onBedingung für diese Zeilen nicht erfüllt werden kann, werden nullWerte für die nicht ausgefüllten Felder eingegeben.

In diesem Wikipedia- Artikel werden die verschiedenen Arten von Verknüpfungen anhand von Ausgabebeispielen anhand eines Beispielsatzes von Tabellen erläutert.


Dann wird bei großen Tischen FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id immer schneller sein als FROM t1,t2 WHERE t1.id=t2.id?
Alexkovelsky

@alexkovelsky innere Verknüpfungen sind oft schneller, wenn nur wenige Übereinstimmungen zwischen den beiden Tabellen bestehen, da die Verwendung von Indizes bedeutet, dass nicht alle Zeilen in einer der Tabellen gelesen werden müssen. Ein vollständiger Outer Join muss immer alle Zeilen in beiden Tabellen (oder den relevanten Indizes) lesen. Wenn Indizes nicht ausreichen oder ein zugrunde liegender Heap gelesen werden muss, um die erforderlichen Spalten auszugeben, ist eine vollständige äußere Verknüpfung fast immer langsamer als eine innere Verknüpfung.
Andrew Hill

1
Ist outer joinschneller oder cross join?
Shafizadeh

2
@Shafizadeh - Sie machen verschiedene Dinge.
Donnie

9
Was ist, wenn ich bei True VOLL OUTER beitrete? Wird das Ergebnis / die Leistung einem CROSS JOIN ähneln?
Architektonische

65

Eine Sache, die für manche nicht immer offensichtlich ist, ist, dass eine Kreuzverknüpfung mit einer leeren Tabelle (oder Ergebnismenge) zu einer leeren Tabelle führt (M x N; daher M x 0 = 0).

Eine vollständige äußere Verknüpfung hat immer Zeilen, es sei denn, sowohl M als auch N sind 0.


32

Ich möchte anderen Antworten einen wichtigen Aspekt hinzufügen, der mir dieses Thema am besten erklärt hat:

Wenn 2 verknüpfte Tabellen M- und N-Zeilen enthalten, erzeugt die Kreuzverknüpfung immer (M x N) Zeilen, aber die vollständige äußere Verknüpfung erzeugt von MAX (M, N) bis (M + N) Zeilen (abhängig davon, wie viele Zeilen tatsächlich vorhanden sind Match "on" Prädikat).

BEARBEITEN:

Aus Sicht der logischen Abfrageverarbeitung erzeugt CROSS JOIN tatsächlich immer M x N Zeilen. Was mit FULL OUTER JOIN passiert, ist, dass sowohl die linke als auch die rechte Tabelle "erhalten" bleiben, als ob sowohl die Verknüpfung LINKS als auch RECHTS geschehen wäre. Daher werden der Ergebnismenge Zeilen aus der linken und rechten Tabelle hinzugefügt, die das ON-Prädikat nicht erfüllen.


2
Schließen diese Grenzen mögliche 1-viele-Übereinstimmungen aus? Eine vollständige äußere Verbindung kann weiterhin (M x N) Zeilen erzeugen.
Maxwellb

1
Wählen Sie COUNT_BIG (*) FROM Traffic t CROSS JOIN Empfänger r und SELECT COUNT_BIG (*) FROM Traffic t FULL JOIN Empfänger r ON (1 = 1) Sie sind gleich.
URL-Leser

2
Ihre ist die beste echte Antwort. Grundsätzlich gilt: a cross joinmultipliziert die Tabellen; a full outer joinfügt sie im schlimmsten Fall hinzu, abhängig davon, wie viele Zeilen übereinstimmen.
Brian Peterson

Ja .. Ich habe nach dieser Mathematik gesucht - produziere aus MAX (M, N) bis (M + N) Zeilen .. Danke stimmte ab.
Arup Rakshit

1
Das ist falsch. FULL JOIN ON-Zeilen sind INNER JOIN ON-Zeilen UNION ALL nicht übereinstimmende linke Tabellenzeilen null erweitert UNION ALL nicht übereinstimmende rechte Tabellenzeilen null erweitert. FULL JOIN kann also M * N Zeilen zurückgeben - möglicherweise größer als MAX (M, N) und M + N. Die minimale und maximale Anzahl von Zeilen, die als Funktion von M & N zurückgegeben werden, ist jedoch nicht sinnvoll . Was nützlich ist, ist eine klare Definition von FULL JOIN ON - in Bezug auf INNER JOIN ON und nicht übereinstimmende Zeilen.
philipxy

15

Cross Joins: Cross Joins erzeugen Ergebnisse, die aus jeder Kombination von Zeilen aus zwei oder mehr Tabellen bestehen. Das heißt, wenn Tabelle A 3 Zeilen und Tabelle B 2 Zeilen hat, führt ein CROSS JOIN zu 6 Zeilen. Es besteht keine Beziehung zwischen den beiden Tabellen - Sie erstellen buchstäblich nur jede mögliche Kombination.

Vollständige äußere Verbindung: Eine vollständige äußere Verbindung ist weder "links" noch "rechts" - es ist beides! Es enthält alle Zeilen aus beiden Tabellen oder Ergebnismengen, die am JOIN teilnehmen. Wenn für Zeilen auf der "linken" Seite von JOIN keine übereinstimmenden Zeilen vorhanden sind, werden Nullwerte aus der Ergebnismenge auf der "rechten Seite" angezeigt. Wenn umgekehrt keine übereinstimmenden Zeilen für Zeilen auf der "rechten" Seite von JOIN vorhanden sind, werden Nullwerte aus der Ergebnismenge auf der "linken Seite" angezeigt.


15

Für SQL Server CROSS JOIN and FULL OUTER JOINsind unterschiedlich. CROSS JOINist einfach ein kartesisches Produkt aus zwei Tabellen, unabhängig von Filterkriterien oder Bedingungen.

FULL OUTER JOINgibt eine eindeutige Ergebnismenge LEFT OUTER JOIN and RIGHT OUTER JOINvon zwei Tabellen. Es benötigt auch die ON-Klausel, um zwei Spalten von Tabellen zuzuordnen.

Tabelle 1 enthält 10 Zeilen und Tabelle 2 enthält 20 Zeilen mit 5 Zeilen, die für bestimmte Spalten übereinstimmen.

Dann CROSS JOINwerden 10 * 20 = 200 Zeilen in der Ergebnismenge zurückgegeben.

FULL OUTER JOIN gibt 25 Zeilen in der Ergebnismenge zurück.

FULL OUTER JOIN(oder ein anderes JOIN) gibt immer eine Ergebnismenge mit kleiner oder gleich zurück Cartesian Product number.

Anzahl der zurückgegebenen Zeilen FULL OUTER JOINgleich ( Anzahl der Zeilen von LEFT OUTER JOIN) + ( Anzahl der Zeilen von RIGHT OUTER JOIN) - ( Anzahl der Zeilen von INNER JOIN).


8

Abgesehen vom zurückgegebenen NULL-Wert handelt es sich um dieselben Konzepte.

Siehe unten:

declare @table1 table( col1 int, col2 int );
insert into @table1 select 1, 11 union all select 2, 22;

declare @table2 table ( col1 int, col2 int );
insert into @table2 select 10, 101 union all select 2, 202;

select
    t1.*,
    t2.*
from @table1 t1
full outer join @table2 t2 on t1.col1 = t2.col1
order by t1.col1, t2.col1;

/* full outer join
col1        col2        col1        col2
----------- ----------- ----------- -----------
NULL        NULL        10          101
1           11          NULL        NULL
2           22          2           202
*/

select
    t1.*,
    t2.*
from @table1 t1
cross join @table2 t2
order by t1.col1, t2.col1;

/* cross join
col1        col2        col1        col2
----------- ----------- ----------- -----------
1           11          2           202
1           11          10          101
2           22          2           202
2           22          10          101
*/

1
Exzellentes Beispiel!
Lucas925

1
danke für das real data beispiel. das macht es klarer.
dtc


2

Eine vollständige äußere Verbindung kombiniert eine linke äußere Verbindung und eine rechte äußere Verbindung. Die Ergebnismenge gibt Zeilen aus beiden Tabellen zurück, in denen die Bedingungen erfüllt sind, gibt jedoch Nullspalten zurück, in denen keine Übereinstimmung vorliegt.

Ein Cross-Join ist ein kartesisches Produkt , für dessen Verknüpfung keine Bedingungen erforderlich sind. Die Ergebnismenge enthält Zeilen und Spalten, die eine Multiplikation beider Tabellen darstellen.


1

Hier ist ein Beispiel, in dem sowohl FULL OUTER JOIN als auch CROSS JOIN dieselbe Ergebnismenge zurückgeben, ohne dass NULL zurückgegeben wird. Bitte beachten Sie die 1 = 1 in der ON-Klausel für den FULL OUTER JOIN:

declare @table1 table (     col1    int,    col2    int ) 
declare @table2 table (     col1    int,    col2    int )

insert into @table1 select  1, 11   union all select    2, 22   

insert into @table2 select  10, 101 union all select     2, 202

select  *
from    @table1 t1 full outer join @table2 t2
    on  1 = 1
(2 Reihe (n) betroffen)

(2 Reihe (n) betroffen)
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 10 101
2 22 10 101
1 11 2 202
2 22 2 202
select  *
from    @table1 t1 cross join @table2 t2
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 10 101
2 22 10 101
1 11 2 202
2 22 2 202

(4 Reihe (n) betroffen)

1

SQL FULL OUTER JOIN

  • Der FULL OUTER JOIN gibt unabhängig von der Übereinstimmung alle Zeilen aus der linken Tabelle (Tabelle 1) und aus der rechten Tabelle (Tabelle 2) zurück.

  • Das Schlüsselwort FULL OUTER JOIN kombiniert das Ergebnis von LEFT OUTER JOIN und RIGHT OUTER JOIN

  • SQL Full Outer Join wird auch als FULL JOIN bezeichnet

Referenz: http://datasciencemadesimple.com/sql-full-outer-join/

SQL CROSS JOIN

  • In SQL CROSS JOIN wird jede Zeile der ersten Tabelle jeder Zeile der zweiten Tabelle zugeordnet.

  • Die Anzahl der Zeilen, die durch eine Ergebnismenge der CROSS JOIN-Operation erzeugt werden, entspricht der Anzahl der Zeilen in der ersten Tabelle multipliziert mit der Anzahl der Zeilen in der zweiten Tabelle.

  • CROSS JOIN ist auch als kartesisches Produkt / kartesisches Join bekannt

  • Die Anzahl der Zeilen in Tabelle A ist m, die Anzahl der Zeilen in Tabelle B ist n und die resultierende Tabelle hat m * n Zeilen

Referenz: http://datasciencemadesimple.com/sql-cross-join/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.