Verschil tussen FULL JOIN & INNERLIJKE JOIN

Wat is het verschil tussen een FULL JOINen een INNER JOIN?

Als ik een FULL JOINdoe, krijg ik 832 records en met een INNER JOINkrijg ik 830 records.


Antwoord 1, autoriteit 100%

OPMERKING: deze zijn allemaal te vinden op Wikipedia: Deelnemen (SQL).

Er zijn drie soorten OUTER-joins:

  • LINKER BUITENSTE JOIN
  • RECHTS BUITENSTE JOIN
  • VOLLEDIGE OUTER JOIN

Het trefwoord OUTER is optioneel in alle implementaties die de standaard volgen, dus FULL JOIN is hetzelfde als FULL OUTER JOIN. (Ik heb het woord OUTERweggelaten uit de SQL in de rest van dit antwoord.)

Laten we eens kijken naar wat elk doet.

Beschouw de volgende twee invoergegevenssets:

Set "A"    Set "B"
 AA         BB
--------   --------
 Item 1     Item 3
 Item 2     Item 4
 Item 3     Item 5
 Item 4     Item 6

Merk op dat er enkele items in A zijn die niet in B staan, en vice versa.

Als we nu een SQL-statement zoals dit schrijven, met LEFT join:

SELECT * FROM A LEFT JOIN B ON AA = BB

Je krijgt het volgende resultaat (de lege gaten zijn eigenlijk NULLtekens):

AA         BB
--------   --------
 Item 1
 Item 2
 Item 3     Item 3
 Item 4     Item 4

Merk op dat u allerijen van AA krijgt, of liever, allerijen uit het linkerdeel van de join-clausule .

Als u overschakelt naar het gebruik van een RECHTS-join:

SELECT * FROM A RIGHT JOIN B ON AA = BB
 AA         BB
--------   --------
 Item 3     Item 3
 Item 4     Item 4
            Item 5
            Item 6

Merk op dat u alle rijen uit het rechtergedeelte van de join-clausule haalt.

Als u echter alle rijen van beide wilt, gebruikt u een FULL-join:

SELECT * FROM A FULL JOIN B ON AA = BB
 AA         BB
--------   --------
 Item 1            <-----+
 Item 2                  |
 Item 3     Item 3       |
 Item 4     Item 4       |
            Item 5       +--- empty holes are NULL's
            Item 6       |
   ^                     |
   |                     |
   +---------------------+

Zoals gesuggereerd in een opmerking, laat me de andere verschillende manieren om mee te doen te voltooien.

Met INNER join:

SELECT * FROM A INNER JOIN B ON AA = BB
 AA         BB
--------   --------
 Item 3     Item 3
 Item 4     Item 4

Met INNER join krijgen we alleen de rijen die echt overeenkomen, geen gaten door samenvoeging.

Een CROSS-join levert een cartesiaans product op door elke rij van de eerste set te matchen met elke rij van de tweede set:

SELECT * FROM A CROSS JOIN B
 AA         BB
--------   --------
 Item 1     Item 3      ^
 Item 1     Item 4      +--- first item from A, repeated for all items of B
 Item 1     Item 5      |
 Item 1     Item 6      v
 Item 2     Item 3      ^
 Item 2     Item 4      +--- second item from A, repeated for all items of B
 Item 2     Item 5      |
 Item 2     Item 6      v
 Item 3     Item 3      ... and so on
 Item 3     Item 4
 Item 3     Item 5
 Item 3     Item 6
 Item 4     Item 3
 Item 4     Item 4
 Item 4     Item 5
 Item 4     Item 6

Houd er rekening mee dat we niet specificeren welke kolommen overeenkomen, aangezien er geen overeenkomst is uitgevoerd.

Ten slotte, NATURAL join, in deze syntaxis specificeren we niet welke kolommen overeenkomen, maar matchen op kolomnamen. In ons gekunstelde voorbeeld zijn geen kolomnamen hetzelfde, maar laten we voor dit specifieke voorbeeld zeggen dat de kolomnamen in beide tabellen XX waren, dan zouden we het volgende resultaat krijgen:

SELECT * FROM A NATURAL JOIN B
 +----------+------- matches on the names, and then the data
 |          |
 v          v
 XX         XX
--------   --------
 Item 3     Item 3
 Item 4     Item 4

Zoals je kunt zien, krijg je hetzelfde als een INNER-join, maar je hoeft het match-gedeelte van de join-clausule niet in te typen.


Antwoord 2, autoriteit 57%

Een FULL OUTER JOINis een samenvoeging van de LEFT OUTER JOINen RIGHT OUTER JOIN.

(klopte dat?)

Mooie visuele uitleg over joins (linksonder beschrijft volledige outer join):
http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

Tegoeden gaan naar C.L. Moffatt’s blogpost op codeproject


Antwoord 3, autoriteit 3%

Op een vrij eenvoudige manier is het belangrijkste verschil:

INNER JOIN– Retourneert alleen overeenkomende rijen. Daarom worden niet-overeenkomende rijen niet opgenomen.

FULL JOIN– Retourneert de rijen die in de rechtertabel staan ​​en niet in de linker, plus de rijen die in de linkertabel staan ​​en niet aan de rechterkant, voorbij de binnenste join-rijen.


Antwoord 4, autoriteit 3%

Het verschil zit in het gedrag van niet-overeenkomende rijen.

Als tabel A bijvoorbeeld een rij heeft die geen overeenkomst heeft in tabel B in het veld waarop de join is gedefinieerd, zou een inner join de rij helemaal weglaten, terwijl een volledige join de rij wel zou bevatten, maar met NULL-waarden voor de velden van tabel B. Viceversa voor niet-overeenkomende rijen van tabel B.


Antwoord 5

Een volledige join retourneert rijen uit beide tabellen, zelfs als er geen overeenkomende rijen in de andere tabel zijn. Een volledige join is als een rechtse en een linkse join tegelijk. Een inner join retourneert alleen rijen die ten minste 1 partner in de andere tabel hebben.


Antwoord 6

Inner join zou geen NULL’s in het join-doelveld brengen. Als er geen overeenkomend record is, staat het origineel niet in de tabel.


Antwoord 7

Dat betekent dat uw tabellen redelijk goed overeenkomen.

De Wiki-pagina die hiergevonden wordt, laat een behoorlijk goed voorbeeld zien van hoe ze werken.


Antwoord 8

Beschouw tabel A en tabel B

Tabel A – (Sleutel, Naam)

1, Gegevens1
2, gegevens2
4, gegevens4
5, Gegevens5

Tabel B – (Sleutel, FKey, Naam)

1, 1, DataA
2, 2, DataB
3, NULL, DataC
4, 4, DataD

Een inner join zou terugkeren

  • 1, Data1, 1, 1, DataA
  • 2, Data2, 2, 2, DataB
  • 4, Data3, 4, 4, DataD

terwijl een volledige outer join zou terugkeren

  • 1, Data1, 1, 1, DataA
  • 2, Data2, 2, 2, DataB
  • NULL, NULL, 3, NULL, DataC
  • 4, Data4, 4, 4, DataD
  • 5, Data5, NULL, NULL, NULL

Other episodes