Joins mit benannten Spalten
Equi-Joins vergleichen häufig Spalten mit dem gleichen Namen in beiden Tabellen.Wenn dies der Fall ist, können wir auch den zweiten Typ eines qualifizierten Joins verwenden: den benannten Spalten join.
Note
|
Benannte Spalten-Joins werden in Dialekt-1-Datenbanken nicht unterstützt. |
Benannte Spalten-Joins haben eine USING
-Klausel, die nur die Spaltennamen angibt.Also stattdessen:
select * from flotsam f
join jetsam j
on f.sea = j.sea
and f.ship = j.ship;
wir können auch schreiben:
select * from flotsam
join jetsam using (sea, ship)
was deutlich kürzer ist.Die Ergebnismenge ist jedoch etwas anders — zumindest bei Verwendung von “SELECT *
”:
-
Der Join mit expliziter Bedingung — mit der
ON
-Klausel — enthält jede der SpaltenSEA
undSHIP
zweimal: einmal aus der TabelleFLOTSAM
und einmal aus der TabelleJETSAM
.Offensichtlich haben sie die gleichen Werte. -
Der Join mit benannten Spalten – mit der
USING
-Klausel – enthält diese Spalten nur einmal.
Wenn Sie alle Spalten in der Ergebnismenge der benannten Spalten verknüpfen möchten, richten Sie Ihre Abfrage wie folgt ein:
select f.*, j.*
from flotsam f
join jetsam j using (sea, ship);
Dadurch erhalten Sie genau die gleiche Ergebnismenge wie beim Join mit expliziter Bedingung.
Für einen OUTER
benannten Spalten-Join gibt es eine zusätzliche Wendung, wenn “SELECT *
” oder ein nicht qualifizierter Spaltenname aus der USING
-Liste verwendet wird:
Wenn eine Zeile aus einem Quellsatz keine Übereinstimmung im anderen hat, aber aufgrund der Direktiven LEFT
, RIGHT
oder FULL
trotzdem eingeschlossen werden muss, erhält die zusammengeführte Spalte in der verbundenen Menge das Nicht- NULL
-Wert.Das ist fair genug, aber jetzt können Sie nicht sagen, ob dieser Wert aus dem linken Satz, dem rechten Satz oder beiden stammt.Dies kann besonders täuschen, wenn der Wert aus dem rechten Satz stammt, da “*
” immer kombinierte Spalten im linken Teil anzeigt — auch bei einem RIGHT
-Join.
Ob dies ein Problem ist oder nicht, hängt von der Situation ab.Wenn dies der Fall ist, verwenden Sie den oben gezeigten Ansatz “a.*, b.*
”, wobei a
und b
die Namen oder Aliase der beiden Quellen sind.Oder noch besser, vermeiden Sie “*
” in Ihren ernsthaften Abfragen und qualifizieren Sie alle Spaltennamen in verbundenen Mengen.Dies hat den zusätzlichen Vorteil, dass Sie sich überlegen müssen, welche Daten Sie woher abrufen möchten.
Es liegt in Ihrer Verantwortung, sicherzustellen, dass die Spaltennamen in der USING
-Liste von kompatiblen Typen zwischen den beiden Quellen sind.Wenn die Typen kompatibel, aber nicht gleich sind, konvertiert die Engine sie in den Typ mit dem breitesten Wertebereich, bevor die Werte verglichen werden.Dies ist auch der Datentyp der zusammengeführten Spalte, der in der Ergebnismenge angezeigt wird, wenn “SELECT *
” oder der nicht qualifizierte Spaltenname verwendet wird.Qualifizierte Spalten hingegen behalten immer ihren ursprünglichen Datentyp.
Tip
|
Wenn Sie beim Zusammenführen nach benannten Spalten eine Join-Spalte in der
Jedoch:
Tatsache ist, dass die nicht spezifizierte Spalte in diesem Fall implizit durch `COALESCE(a.x, b.x) ersetzt wird.Dieser clevere Trick wird verwendet, um Spaltennamen eindeutig zu machen, stört aber auch die Verwendung des Indexes. |