SQL Server: wat is het verschil tussen CROSS JOIN en FULL OUTER JOIN?

Wat is het verschil tussen CROSS JOIN en FULL OUTER JOIN in SQL Server?

Zijn ze hetzelfde of niet? Gelieve uit te leggen. Wanneer zou men een van deze gebruiken?


Antwoord 1, autoriteit 100%

Een cross join produceert een cartesiaans product tussen de twee tabellen, waarbij alle mogelijke combinaties van alle rijen worden geretourneerd. Het heeft geen on-clausule omdat je gewoon alles bij alles aansluit.

Een FULL OUTER JOINis een combinatie van een left outeren right outerjoin. Het retourneert alle rijen in beide tabellen die overeenkomen met de where-clausule van de query, en in gevallen waarin niet kan worden voldaan aan de on-voorwaarde voor die rijen, wordt nullwaarden in voor de niet-ingevulde velden.

Dit wikipediaartikel legt de verschillende soorten joins uit met voorbeelden van output gegeven een voorbeeldset tabellen.


Antwoord 2, autoriteit 28%

Een ding dat voor sommigen misschien niet altijd duidelijk is, is dat een kruisverbinding met een lege tabel (of resultaatset) resulteert in een lege tabel (M x N; vandaar M x 0 = 0)

Een volledige outer join heeft altijd rijen, tenzij zowel M als N 0 zijn.


Antwoord 3, autoriteit 16%

Ik zou graag één belangrijk aspect willen toevoegen aan andere antwoorden, die dit onderwerp eigenlijk op de beste manier aan mij hebben uitgelegd:

Als 2 samengevoegde tabellen M- en N-rijen bevatten, levert cross-join altijd (M x N) rijen op, maar een volledige outer join levert MAX(M,N) tot (M + N) rijen op (afhankelijk van hoe veel rijen komen daadwerkelijk overeen met het predikaat “aan”).

BEWERKEN:

Vanuit het oogpunt van logische queryverwerking, produceert CROSS JOIN inderdaad altijd M x N rijen. Wat er gebeurt met FULL OUTER JOIN is dat zowel de linker- als de rechtertafel worden “bewaard”, alsof zowel LEFT als RIGHT join plaatsvond. Dus rijen die niet voldoen aan het ON-predikaat, van zowel de linker- als de rechtertafel worden toegevoegd aan de resultatenset.


Antwoord 4, autoriteit 10%

Voor SQL Server zijn CROSS JOIN and FULL OUTER JOINverschillend.
CROSS JOINis gewoon een Cartesiaans product van twee tabellen, ongeacht filtercriteria of voorwaarden.

FULL OUTER JOINgeeft een unieke resultaatset van LEFT OUTER JOIN and RIGHT OUTER JOINvan twee tabellen. Het heeft ook een ON-clausule nodig om twee kolommen met tabellen toe te wijzen.

Tabel 1 bevat 10 rijen en Tabel 2 bevat 20 rijen met 5 rijen die overeenkomen met specifieke kolommen.

Vervolgens zal CROSS JOIN10*20=200 rijen teruggeven in de resultatenset.

FULL OUTER JOINretourneert 25 rijen in de resultatenset.
INNER JOINretourneert overeenkomende rijen, dus 5 rijen in de resultatenset.

FULL OUTER JOIN(of een andere JOIN) retourneert altijd een resultaatset met minder dan of gelijk aan Cartesian Product number.

Aantal rijen geretourneerd door FULL OUTER JOINgelijk aan (Aantal rijen per LEFT OUTER JOIN) + (Aantal rijen per RIGHT OUTER JOIN) – (Aantal rijen per INNER JOIN).


Antwoord 5, autoriteit 6%

Cross join :Cross joins produceren resultaten die bestaan ​​uit elke combinatie van rijen uit twee of meer tabellen. Dat betekent dat als tabel A 3 rijen heeft en tabel B 2 rijen, een CROSS JOIN resulteert in 6 rijen. Er is geen relatie tussen de twee tabellen – je maakt letterlijk elke mogelijke combinatie.

Volledige outer join : EEN VOLLEDIGE OUTER JOIN is niet “links” of “rechts” – het is allebei! Het bevat alle rijen van beide tabellen of resultatensets die deelnemen aan de JOIN. Als er geen overeenkomende rijen zijn voor rijen aan de “linkerkant” van de JOIN, ziet u Null-waarden van de resultaatset aan de “rechterkant”. Omgekeerd, wanneer er geen overeenkomende rijen bestaan ​​voor rijen aan de “rechterkant” van de JOIN, ziet u Null-waarden van de resultaatset aan de “linkszijde”.


Antwoord 6, autoriteit 6%

Het zijn dezelfde concepten, afgezien van de geretourneerde NULL-waarde.

Zie hieronder:

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
*/

7

Een volledige buitenste join combineert een linker buitenste join en een rechter buitenste join. De resultatenset retourneert rijen van beide tabellen waar aan de voorwaarden wordt voldaan, maar retourneert nulkolommen waar er geen overeenkomst is.

A Cross-join is een Cartesiaans product vereist geen voorwaarde om aan tafel te gaan. De resultatenset bevat rijen en kolommen die een vermenigvuldiging van beide tabellen zijn.

Other episodes