eBizTalk - Berichten, Unterhalten, Weiterbilden
Ob Branchendiskurs, Fachartikel oder ein Blick hinter die Unternehmenskulissen: eBizTalk ist die Plattform, die uns auffordert, unsere Leser über Events und Projekte auf dem Laufenden zu halten. Und uns gegenseitig natürlich auch.

DBJoins oder “Wie verknüpfe ich Datenbank-Tabellen richtig!”

Veröffentlicht am 26.09.2014 von Ireen Raue , Custom Development

Nachfolgend findet ihr eine kleine Übersicht, welche Joins es im (T-)SQL gibt und wie sich diese auf das Ergebnis einer Abfrage auswirken.

Als Ausgangspunkt haben wir die zwei folgenden Tabellen

SELECT * FROM Obst

SELECT * FROM Baum

ID

Obstname

1 Apfel
2 Birne
3 Erdbeere
4 Pfirsich
5 Kirsche
6 Heidelbeere

ID

Baumname

1 Pfirsich
2 Apfel
3 Birne
4 Linde
5 Kastanie
6 Kirsche

 

INNER JOIN

Mit einem INNER JOIN erhält man alle Datensätze, die über die Join-Bedingung in beiden Tabellen vorhanden sind, wobei das Wort “INNER” auch weggelassen werden kann. Ein einfacher Join ist immer ein Inner Join.

SELECT * FROM Obst
INNER JOIN Baum ON Obst.Obstname=Baum.Baumname

SELECT * FROM Obst
JOIN Baum ON Obst.Obstname=Baum.Baumname

ID

Obstname

ID

Baumname

1 Apfel 2 Apfel
2 Birne 3 Birne
4 Pfirsich 1 Pfirsich
5 Kirsche 6 Kirsche

 

OUTER JOIN

Ein OUTER JOIN gibt alle Datensätze aus beiden Tabellen aus. Verknüpft werden dabei die Zeilen, die der Join-Bedingung entsprechen. Dort wo es keine Entsprechung in der anderen Tabelle gibt, werden NULL-Werte ausgegeben.

Es wird unterschieden, ob man alle Zeilen von einer Tabelle oder von beiden Tabellen erhalten möchte. Das heißt es sind immer die Zusätze LEFT, RIGHT oder FULL erforderlich und das Wort OUTER ist wie INNER optional.

LEFT OUTER JOIN

Mit einem LEFT OUTER JOIN erhält man alle Datensätze der linken Tabelle inklusive der Entsprechungen aus der rechten Tabelle.

SELECT * FROM Obst
LEFT OUTER JOIN Baum ON Obst.Obstname=Baum.Baumname

SELECT * FROM Obst
LEFT JOIN Baum ON Obst.Obstname=Baum.Baumname

ID

Obstname

ID

Baumname

1 Apfel 2 Apfel
2 Birne 3 Birne
3 Erdbeere NULL NULL
4 Pfirsich 1 Pfirsich
5 Kirsche 6 Kirsche
6 Heidelbeere NULL NULL

 

Wenn man nur die Datensätze der linken Tabelle ohne Verknüpfung zu der rechten Tabelle als Ergebnis haben möchte, kann man diese über die WHERE-Klausel ausschließen.

SELECT * FROM Obst
LEFT OUTER JOIN Baum ON Obst.Obstname=Baum.Baumname
WHERE Baum.ID IS NULL

ID

Obstname

ID

Baumname

3 Erdbeere NULL NULL
6 Heidelbeere NULL NULL

 

RIGHT OUTER JOIN

Mit einem RIGHT OUTER JOIN erhält man alle Datensätze der rechten Tabelle inklusive der Entsprechungen aus der linken Tabelle.

SELECT * FROM Obst
RIGHT OUTER JOIN Baum ON Obst.Obstname=Baum.Baumname

SELECT * FROM Obst
RIGHT JOIN Baum ON Obst.Obstname=Baum.Baumname

ID

Obstname

ID

Baumname

4 Pfirsich 1 Pfirsich
1 Apfel 2 Apfel
2 Birne 3 Birne
NULL NULL 4 Linde
NULL NULL 5 Kastanie
5 Kirsche 6 Kirsche

 

Möchte man nur die Datensätze der rechten Tabelle ohne Verknüpfung zu der linken Tabelle im Ergebnis, kann man diese über die WHERE-Klausel ausklammern.

SELECT * FROM Obst
RIGHT OUTER JOIN Baum ON Obst.Obstname=Baum.Baumname
WHERE Obst.ID IS NULL

 

ID

Obstname

ID

Baumname

NULL NULL 4 Linde
NULL NULL 5 Kastanie

 

FULL OUTER JOIN

Mit einem FULL OUTER JOIN erhält man alle Datensätze aus beiden Tabellen. Die Zeilen mit einer Entsprechung in der anderen Tabelle sind dann mit Werten gefüllt, die ohne Entsprechung enthalten NULL.

SELECT * FROM Obst
FULL OUTER JOIN Baum ON Obst.Obstname=Baum.Baumname 

SELECT * FROM Obst
FULL JOIN Baum ON
Obst.Obstname=Baum.Baumname 

SELECT * FROM Obst
LEFT OUTER JOIN Baum ON Obst.Obstname=Baum.Baumname
UNION
SELECT * FROM Obst
RIGHT OUTER JOIN Baum ON Obst.Obstname=Baum.Baumname

ID

Obstname

ID

Baumname

1 Apfel 2 Apfel
2 Birne 3 Birne
3 Erdbeere NULL NULL
4 Pfirsich 1 Pfirsich
5 Kirsche 6 Kirsche
6 Heidelbeere NULL NULL
NULL NULL 4 Linde
NULL NULL 5 Kastanie

 

Wenn man nur die Datensätze beider Tabelle ohne Verknüpfung zur anderen Tabelle auslesen möchte, kann man diese über die WHERE-Klausel ausklammern.

SELECT * FROM Obst
FULL OUTER JOIN Baum ON Obst.Obstname=Baum.Baumname
WHERE Obst.ID IS NULL OR
Baum.ID IS NULL

ID

Obstname

ID

Baumname

3 Erdbeere NULL NULL
6 Heidelbeere NULL NULL
NULL NULL 4 Linde
NULL NULL 5 Kastanie

  

CROSS JOIN

Zu guter Letzt gibt es noch den CROSS JOIN. Hiermit werden alle Datensätze der einen Tabelle mit allen Datensätzen der anderen Tabelle verknüpft. Das Ganze wird auch “Kartesisches Produkt” genannt.

Die Zeilenanzahl des Ergebnisses ergibt sich also aus:

Anzahl Zeilen der einen Tabelle *Anzahl Zeilen der anderen Tabelle

In unserem Beispiel: 6*6=36.

Das graphisch darzustellen, ist ein bisschen schwierig. Man stelle sich einfach eine dicke schwarze Wolke vor.
Auf diese Art des Joins sollte man bei großen Tabellen aus Performance-Gründen allerdings besser verzichten. 

SELECT * FROM Obst
CROSS JOIN Baum

SELECT * FROM Obst, Baum

ID

Obstname

ID

Baumname

1 Apfel 1 Pfirsich
2 Birne 1 Pfirsich
3 Erdbeere 1 Pfirsich
4 Pfirsich 1 Pfirsich
5 Kirsche 1 Pfirsich
6 Heidelbeere 1 Pfirsich
1 Apfel 2 Apfel
2 Birne 2 Apfel
3 Erdbeere 2 Apfel
4 Pfirsich 2 Apfel
5 Kirsche 2 Apfel
6 Heidelbeere 2 Apfel
1 Apfel 3 Birne
2 Birne 3 Birne
3 Erdbeere 3 Birne
4 Pfirsich 3 Birne
5 Kirsche 3 Birne
6 Heidelbeere 3 Birne
1 Apfel 4 Linde
2 Birne 4 Linde
3 Erdbeere 4 Linde
4 Pfirsich 4 Linde
5 Kirsche 4 Linde
6 Heidelbeere 4 Linde
1 Apfel 5 Kastanie
2 Birne 5 Kastanie
3 Erdbeere 5 Kastanie
4 Pfirsich 5 Kastanie
5 Kirsche 5 Kastanie
6 Heidelbeere 5 Kastanie
1 Apfel 6 Kirsche
2 Birne 6 Kirsche
3 Erdbeere 6 Kirsche
4 Pfirsich 6 Kirsche
5 Kirsche 6 Kirsche
6 Heidelbeere 6 Kirsche

 

Alternativen

Manchmal brauch man gar nicht unbedingt einen Join für das gewünschte Ergebnis. Mit EXCEPT, INTERSECT oder Subselects lassen sich ebenfalls ähnlich Ergebnisse erzielen. Es kommt aber immer darauf an, was als Ergebnis erwartet wird.

Mit INTERSECT oder einem Subselect bekommt man z.B. die gleichen Daten wie bei einem Inner join.

SELECT Obstname FROM Obst
INTERSECT
SELECT Baumname FROM Baum 

SELECT Obstname FROM Obst
WHERE Obstname IN
(SELECT Baumname FROM Baum)

Obstname

Apfel
Birne
Kirsche
Pfirsich

 

Mit EXCEPT oder einem Subselect kann man die Daten aus der 2. Tabelle aus dem Ergebnis ausschließen.

SELECT Obstname FROM Obst
EXCEPT
SELECT Baumname FROM Baum

SELECT Obstname FROM Obst
WHERE Obstname NOT IN
(SELECT Baumname FROM Baum)

Obstname

Erdbeere
Heidelbeere

 

Zusammenfassung

 

google_about_ebiz fb_about_ebiztwitter_about_ebizxing_about_ebiz
ebiz_consulting_expertise