In SQL können Sie drei oder mehr Tabellen verknüpfen, indem Sie nach der ersten eine weitere Verknüpfung hinzufügen.
Sie können auch verschachtelte Joins ausführen, indem Sie einen Join als Join-Bedingung für einen anderen angeben.
Syntax
Die gebräuchlichste Art, drei Tabellen zu verbinden, sieht ungefähr so aus:
SELECT *
FROM Table1
INNER JOIN Table2
ON Condition
INNER JOIN Table3
ON Condition;
Dabei wird ein innerer Join verwendet, aber Sie können den gewünschten Join-Typ wie bei jedem anderen Join angeben. Sie können bei Bedarf auch Join-Typen kombinieren (Beispiel unten).
Sie können auch verschachtelte Joins verwenden, indem Sie einen Join als Join-Bedingung für einen anderen Join angeben. So:
SELECT *
FROM Table1
JOIN (Table2
JOIN Table3
ON Condition)
ON Condition;
Beispieldaten – Die 3 Tabellen
Angenommen, wir haben die folgenden drei Tabellen.
Die Customers
Tabelle:
+--------------+-----------+------------- --+----------------+| Kunden-ID | Kundenname | PostalCityId | Telefonnummer ||--------------+----------------+--------------- -+----------------|| 1 | Homer McKenzie | 19586 | (308) 555-0100 || 2 | Marge Pratt | 33475 | (406) 555-0100 || 3 | Vlad Bernanke | NULL | (480) 555-0100 || 4 | Bart Pitt | 21692 | (316) 555-0100 || 5 | Lisa McQueen | 12748 | (212) 555-0100 || 6 | Steve Simpson | 17054 | (701) 555-0100 || 7 | Vinn Allen | 12152 | (423) 555-0100 || 8 | Veejay Smith | 3673 | (303) 555-0100 || 9 | Kasey Chin | 23805 | (201) 555-0100 || 10 | Borat Lee | 37403 | (701) 555-0100 |+-------------+----------------+---------- ------+----------------+(10 Zeilen betroffen)
Die Cities
Tabelle:
+----------+----------------+----------------- -+--------------+| CityId | Ortsname | StateProvinceId | Bevölkerung ||----------+-----------+------------------ +--------------|| 3673 | Bogen März | 6 | 866 || 12152 | Frankewing | 44 | NULL || 12748 | Gassport | 33 | 1248 || 21692 | Medizin-Loge | 17 | 2009 || 26483 | Peeples-Tal | 3 | 428 || 33475 | Sylvanit | 27 | 103 || 17054 | Jessie | 35 | 25 || 19586 | Lisa | 28 | NULL || 37403 | Wimbledon | 35 | 216 |+----------+-----------+------------------ +--------------+(9 Zeilen betroffen)
Die StateProvinces
Tabelle:
+--------------+---------------------+---- -------------+-------------+--------------+| StateProvinceId | StaatProvinzCode | StaatProvinzName | LänderID | Bevölkerung ||------+---------------------+----- -----------+-------------+--------------|| 3 | AZ | Arizona | 230 | 6891688 || 6 | CO | Colorado | 230 | 5698265 || 17 | KS | Kansas | 230 | 2893957 || 28 | N.E. | Nebraska | 230 | 1943256 || 31 | New Jersey | New-Jersey | 230 | 8899339 || 33 | NY | New York | 230 | 20437172 || 35 | ND | North Dakota | 230 | 723393 || 44 | TN | Tennessee | 230 | 6495978 |+------+---------------------+----- -----------+-------------+-------------+(8 Zeilen betroffen )
Beispiel 1 – Inner Join 3 Tabellen
Der beliebteste Join-Typ ist der Inner Join, also fangen wir damit an.
Hier ist ein Beispiel für die Verknüpfung der obigen drei Tabellen mit zwei Inner Joins.
SELECT
s.StateProvinceName,
ci.CityName,
cu.CustomerName
FROM StateProvinces s
INNER JOIN Cities AS ci
ON ci.StateProvinceID = s.StateProvinceID
INNER JOIN Customers cu
ON cu.PostalCityId = ci.CityId;
Ergebnis:
+---------------------+----------------+------- ---------+| StaatProvinzName | Ortsname | Kundenname ||---------------------+----------------+-------- --------|| Nebraska | Lisa | Homer McKenzie || Kansas | Medizin-Loge | Bart Pitt || New York | Gassport | Lisa McQueen || North Dakota | Jessie | Steve Simpson || Tennessee | Frankewing | Vinn Allen || Colorado | Bogen März | Veejay Smith || North Dakota | Wimbledon | Borat Lee |+---------------------+----------------+------- ---------+(7 Zeilen betroffen)
Beispiel 2 – Kombinieren von Join-Typen
Sie können Join-Typen kombinieren, wenn Sie drei oder mehr Tabellen verbinden.
Hier ist ein Beispiel für die Kombination eines Inner Join mit einem Left Join.
SELECT
s.StateProvinceName,
ci.CityName,
cu.CustomerName
FROM StateProvinces s
INNER JOIN Cities AS ci
ON ci.StateProvinceID = s.StateProvinceID
LEFT JOIN Customers cu
ON cu.PostalCityId = ci.CityId;
Ergebnis:
---------------------+----------------+-------- --------+| StaatProvinzName | Ortsname | Kundenname ||---------------------+----------------+-------- --------|| Colorado | Bogen März | Veejay Smith || Tennessee | Frankewing | Vinn Allen || New York | Gassport | Lisa McQueen || Kansas | Medizin-Loge | Bart Pitt || Arizona | Peeples-Tal | NULL || North Dakota | Jessie | Steve Simpson || Nebraska | Lisa | Homer McKenzie || North Dakota | Wimbledon | Borat Lee |+---------------------+----------------+------- ---------+(8 Zeilen betroffen)
In diesem Fall haben wir eine Stadt (Peeples Valley), die noch keine Kunden hat.
Der Grund, warum wir diese Informationen jetzt sehen können, ist, dass der linke Join Zeilen zurückgibt, die Daten in der linken Tabelle enthalten, selbst wenn es keine übereinstimmenden Zeilen in der linken Tabelle gibt.
Das vorherige Beispiel, in dem zwei Inner Joins kombiniert wurden, hat diese Zeile nicht zurückgegeben, da Inner Joins nicht übereinstimmende Zeilen aus beiden Tabellen verwerfen. Es gibt nur Zeilen zurück, wenn in beiden Tabellen mindestens eine Zeile vorhanden ist, die der Join-Bedingung entspricht.
Neue Beispieldaten – 3 verschiedene Tabellen
Für die verbleibenden Beispiele verwenden wir die folgenden Tabellen.
Die PetTypes
Tabelle:
+-------------+-----------+| PetTypeId | Haustiertyp ||-------------+-----------|| 1 | Vogel || 2 | Katze || 3 | Hund || 4 | Hase |+-------------+-----------+(4 Zeilen betroffen)
Die Pets
Tabelle:
+---------+------------+-----------+---------- -+------------+| Haustier-ID | PetTypeId | Eigentümer-ID | Haustiername | Geburtsdatum ||---------+------------+-----------+----------- +------------|| 1 | 2 | 3 | Flauschig | 2020-11-20 || 2 | 3 | 3 | Holen | 2019-08-16 || 3 | 2 | 2 | Kratzer | 01.10.2018 || 4 | 3 | 3 | Wackeln | 2020-03-15 || 5 | 1 | 1 | Twittern | 2020-11-28 || 6 | 3 | 4 | Flauschig | 2020-09-17 || 7 | 3 | 2 | Rinde | NULL || 8 | 2 | 4 | Miau | NULL |+---------+------------+-----------+----------- +------------+(8 Zeilen betroffen)
Die Owners
Tabelle:
+-----------+------------+-----------+------- ---------+-------------------+| Eigentümer-ID | Vorname | Nachname | Telefon | E-Mail ||-----------+-------------+------------+-------- --------+-------------------|| 1 | Homer | Conner | (308) 555-0100 | [email protected] || 2 | Bart | Pitt | (231) 465-3497 | [email protected] || 3 | Nancy | Simpson | (489) 591-0408 | NULL || 4 | Boris | Trumpf | (349) 611-8908 | NULL || 5 | Holzig | Eastwood | (308) 555-0112 | [email protected] |+-----------+---------------------+------------+---- -------------+-------------------+
Beachten Sie Folgendes:
- Die
PetTypeId
Spalte derPets
table ist ein Fremdschlüssel derPetTypeId
derPetTypes
Tabelle (das ist der Primärschlüssel dieser Tabelle). - Die
OwnerId
Spalte derPets
table ist ein Fremdschlüssel derOwnerId
Spalte derOwners
Tabelle.
Beispiel 3 – Left Join 3 Tabellen
Lassen Sie uns einen Drei-Tabellen-Join mit zwei linken Joins erstellen.
Hier ist ein Beispiel für die Ausführung von zwei Linksverknüpfungen mit diesen Tabellen.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o LEFT JOIN Pets p
ON p.OwnerId = o.OwnerId
LEFT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Ergebnis:
+-----------+-----------+----------------+| Haustiername | Haustiertyp | Haustierbesitzer ||-----------+-----------+----------------|| Twittern | Vogel | Homer Connery || Kratzer | Katze | Bart Pitt || Rinde | Hund | Bart Pitt || Flauschig | Katze | Nancy Simpson || Holen | Hund | Nancy Simpson || Wackeln | Hund | Nancy Simpson || Flauschig | Hund | Boris Trumpf || Miau | Katze | Boris Trumpf || NULL | NULL | Woody Eastwood |+-----------+-----------+----------------+(9 Zeilen betroffen)
Hier haben wir einen Haustierbesitzer, der kein Haustier hat. Wir können das überprüfen, indem wir uns die Pets.OwnerId
ansehen -Spalte und sehen, dass es keinen Wert gibt, der Woody Eastwoods OwnerId
entspricht in den Owners
Tabelle.
Beispiel 4 – Rechte Verknüpfung von 3 Tabellen
Der rechte Join ist das Gegenteil des linken Joins. Hier ist ein Beispiel, das dieselben drei Tabellen verwendet.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p RIGHT JOIN Owners o
ON p.OwnerId = o.OwnerId
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Ergebnis:
+-----------+-----------+---------------+| Haustiername | Haustiertyp | Haustierbesitzer ||-----------+-----------+---------------|| Twittern | Vogel | Homer Connery || Flauschig | Katze | Nancy Simpson || Kratzer | Katze | Bart Pitt || Miau | Katze | Boris Trumpf || Holen | Hund | Nancy Simpson || Wackeln | Hund | Nancy Simpson || Flauschig | Hund | Boris Trumpf || Rinde | Hund | Bart Pitt || NULL | Kaninchen | |+-----------+-----------+---------------+(9 Zeilen betroffen)
Dieses Mal haben wir einen zusätzlichen Haustiertyp (Rabbit
), aber nicht der zusätzliche Eigentümer. Dies liegt daran, dass Right Joins Zeilen zurückgeben, die Daten in der rechten Tabelle enthalten, selbst wenn es keine übereinstimmenden Zeilen in der linken Tabelle gibt.
Übrigens der Grund der letzte PetOwner
ist nicht NULL
(wie zuletzt der PetName
ist) liegt daran, dass es das Ergebnis einer Zeichenfolgenverkettung ist. Ich habe das T-SQL CONCAT()
verwendet Funktion, um den Vor- und Nachnamen des Besitzers zu verketten.
Beispiel 5 – Vollständige Verknüpfung von 3 Tabellen
Die vollständige Verknüpfung ist wie eine linke und eine rechte Verknüpfung in einem. Es gibt alle Zeilen zurück, solange es in einer der Tabellen übereinstimmende Daten gibt.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o FULL JOIN Pets p
ON p.OwnerId = o.OwnerId
FULL JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Ergebnis:
+-----------+-----------+----------------+| Haustiername | Haustiertyp | Haustierbesitzer ||-----------+-----------+----------------|| Twittern | Vogel | Homer Connery || Kratzer | Katze | Bart Pitt || Rinde | Hund | Bart Pitt || Flauschig | Katze | Nancy Simpson || Holen | Hund | Nancy Simpson || Wackeln | Hund | Nancy Simpson || Flauschig | Hund | Boris Trumpf || Miau | Katze | Boris Trumpf || NULL | NULL | Woody Eastwood || NULL | Kaninchen | |+-----------+-----------+----------------+(10 Zeilen betroffen)Dieses Mal erhalten wir eine Kombination der Ergebnisse, die wir in den beiden vorherigen Beispielen erhalten haben.
Beispiel 6 – Verschachtelte Joins
Wie bereits erwähnt, können Sie auch verschachtelte Joins erstellen.
Hier ist ein Beispiel für einen verschachtelten Join.
SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner FROM Owners o LEFT JOIN (Pets p LEFT JOIN PetTypes pt ON p.PetTypeId = pt.PetTypeId) ON p.OwnerId = o.OwnerId;
Ergebnis:
+-----------+-----------+----------------+| Haustiername | Haustiertyp | Haustierbesitzer ||-----------+-----------+----------------|| Twittern | Vogel | Homer Connery || Kratzer | Katze | Bart Pitt || Rinde | Hund | Bart Pitt || Flauschig | Katze | Nancy Simpson || Holen | Hund | Nancy Simpson || Wackeln | Hund | Nancy Simpson || Flauschig | Hund | Boris Trumpf || Miau | Katze | Boris Trumpf || NULL | NULL | Woody Eastwood |+-----------+-----------+----------------+(9 Zeilen betroffen)