Was ist der Unterschied zwischen CROSS JOIN und FULL OUTER JOIN in SQL Server?
Sind sie gleich oder nicht? Bitte erkläre. Wann würde man eines davon verwenden?
Was ist der Unterschied zwischen CROSS JOIN und FULL OUTER JOIN in SQL Server?
Sind sie gleich oder nicht? Bitte erkläre. Wann würde man eines davon verwenden?
Antworten:
Eine Kreuzverknüpfung erzeugt ein kartesisches Produkt zwischen den beiden Tabellen und gibt alle möglichen Kombinationen aller Zeilen zurück. Es gibt keine on
Klausel, weil Sie einfach alles mit allem verbinden.
A full outer join
ist eine Kombination aus a left outer
und right outer
join. Es gibt alle Zeilen in beiden Tabellen zurück, die mit der where
Klausel der Abfrage übereinstimmen , und in Fällen, in denen die on
Bedingung für diese Zeilen nicht erfüllt werden kann, werden null
Werte 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.
outer join
schneller oder cross join
?
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.
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.
cross join
multipliziert die Tabellen; a full outer join
fügt sie im schlimmsten Fall hinzu, abhängig davon, wie viele Zeilen übereinstimmen.
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.
Für SQL Server CROSS JOIN and FULL OUTER JOIN
sind unterschiedlich.
CROSS JOIN
ist einfach ein kartesisches Produkt aus zwei Tabellen, unabhängig von Filterkriterien oder Bedingungen.
FULL OUTER JOIN
gibt eine eindeutige Ergebnismenge LEFT OUTER JOIN and RIGHT OUTER JOIN
von 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 JOIN
werden 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ückCartesian Product number
.Anzahl der zurückgegebenen Zeilen
FULL OUTER JOIN
gleich ( Anzahl der Zeilen vonLEFT OUTER JOIN
) + ( Anzahl der Zeilen vonRIGHT OUTER JOIN
) - ( Anzahl der Zeilen vonINNER JOIN
).
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
*/
Cross Join : http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
TLDR; Erzeugt alle möglichen Kombinationen zwischen 2 Tabellen (karthesisches Produkt)
(Vollständig) Outer Join : http://www.w3schools.com/Sql/sql_join_full.asp
TLDR; Gibt jede Zeile in beiden Tabellen und auch Ergebnisse mit denselben Werten zurück (Übereinstimmungen in ZUSTAND).
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.
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)
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
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
FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id
immer schneller sein alsFROM t1,t2 WHERE t1.id=t2.id
?