Join-Tabelle

Die Join-Tabelle ist die Umsetzung der verschiedenen Join-Arten aus der relationalen Algebra in den SQL-Standard, die z.B. seit Oracle Version 9 implementiert sind. Die Join-Tabelle wird in der FROM-Klausel einer SELECT-Anfrage eingesetzt. Unter SQL gibt es über die Join-Arten der relationalen Algebra hinaus noch weitere Join-Typen (siehe Join-Typ-SQL).

Syntax der Join-Tabelle (Auszug)

   <Join-Tabelle> ::= <Kreuzprodukt> | <Qualifizierter-Join> | <NATURAL JOIN>

   <Kreuzprodukt> ::= <Tabellenreferenz> CROSS JOIN <Tabellenreferenz>

   <Qualifizierter-Join>  ::= <Tabellenreferenz> [ <Join-Typ> ] JOIN <Tabellenreferenz>
                            { ON [<Suchbedingung>] | USING ( Spaltenname [ , Spaltenname ]... ) } 

   <NATURAL JOIN> ::= <Tabellenreferenz> NATURAL [ <Join-Typ> ] JOIN <Tabellenreferenz>

   <Join-Typ>     ::= [ INNER ] | { LEFT | RIGHT | FULL } [ [ OUTER ]
  • Das <Kreuzprodukt> entspricht dem kartesischem Produkt aus der relationalen Algebra.
  • Eine <Tabellenreferenz> ist ein Tabellennamen, ein Anfragemengenausdruck oder wieder eine <Join-Tabelle>.
  • Im SQL-Standard ist als rechter Join-Operator statt einer Tabellenreferenz nur ein sog. <Tabellenfaktor> zugelassen, was sich auf einen Tabellennamen oder einen Anfragemengenausdruck beschränkt.
  • Bei der ON <Suchbedingung> werden Spalten aus verschiedenen Tabellenreferenzen gleichgesetzt, die nicht gleich heißen müssen, z.B. ON TAB1.Spalte1 = TAB2.Spalte2 oder ON TAB1.Spalte1 > TAB2.Spalte2. Diese Bedingung fungiert als Verknüpfungsbedingung zwischen den beiden Tabellenreferenzen. Sie kann aber auch noch zusätzlich durch eine <Suchbedingung> eingeschränkt werden (siehe 7.Beispiel).
  • Bei USING werden die Tabellenspalten aufgezählt, die in den verwendeten Tabellenreferenzen gleich heißen. Es wird dabei kein Tabellenalias verwendet, auch nicht in der vorher verwendeten SELECT-Klausel. Using und ON-Bedingung schließen sich aus.
  • Der <NATURAL JOIN> entspricht dem natürlichen Join aus der Relationalen Algebra und freundlicherweise taucht hier auch das Wort NATURAL in SQL auf.
  • Der <Join-Typ> kann ein INNER-Join oder ein OUTER-Join sein, wobei der OUTER-Join noch mal in LEFT, RIGHT oder FULL spezifiziert ist (siehe Outer Join wie in der relationalen Algebra).
  • Der Inner-Join kann weder LEFT noch RIGHT noch FULL sein. Beim Inner-Join können in der ON-Klausel im Gegensatz zum Natural Join auch verschiedene Spaltennamen eingetragen werden. Der Inner-Join verknüpft Zeilen aus zwei Tabellen, wenn die zu verknüpfenden Werte in allen Tabellen vorkommen. Da die <Join-Bedingung> nicht weiter spezifiziert ist, entspricht der Inner-Join dem Theta-Join aus der relationalen Algebra. Der Ausdruck [INNER] kann daher auch wegfallen, ohne das SQL-Resultat im <Join-Typ> zu verändern. Das gilt auch für das Wort [OUTER] im Outer-Join.
  • Ein Outer-Join verknüpft Zeilen aus zwei Tabellen, auch wenn die zu verknüpfenden Werte nur in einer Tabelle vorkommen. Ein Outer-Joiin kann keine USING-Klausel verwenden..

1. Beispiel:

 /*Alte Schreibweise des kartesischen Produkts in SQL:*/
 SELECT * FROM TAB1, TAB2;

 /*Neue Schreibweise des kartesischen Produkts in SQL mit gleichem Ergebnis:*/
 SELECT * FROM TAB1 CROSS JOIN TAB1;

2. Beispiel: Verschiedene Schreibweisen des Natural-Joins mit gleichem Ergebnis:

 SELECT * FROM TAB1  INNER JOIN TAB2 ON TAB1.SPALTE1= TAB1.SPALTE1;
 SELECT * FROM TAB1  NATURAL JOIN TAB2;
 SELECT * FROM TAB1, TAB2 WHERE TAB1.SPALTE1= TAB1.SPALTE1; -- alte Schreibweise in SQL
 /*Wenn nur das Schlüsselwort NATURAL JOIN verwendet wird, wird verglichen, 
   ob in TAB1 und TAB2 Spalten mit gleichem Namen existieren und diese werden dann automatisch gleichgesetzt.*/

3. Beispiel: Verschiedene Outer-Join-Varianten

 SELECT * FROM  TAB1 RIGHT OUTER JOIN TAB2 ON TAB1.SPALTE1 = TAB2.SPALTE2;
 SELECT * FFROM TAB1 LEFT  OUTER JOIN TAB2 ON TAB1.SPALTE1 = TAB2.SPALTE2;
 SELECT * FFROM TAB1 FULL  OUTER JOIN TAB2 ON TAB1.SPALTE1 = TAB2.SPALTE2;

 SELECT * FROM  TAB1 RIGHT OUTER JOIN TAB2 USING (SPALTE1);   
 /*Die Verwendung von USING setzt voraus, dass TAB1 und TAB2 die SPALTE1 gemeinsam haben.*/

4. Beispiel: Ein Equi-Join

 SELECT * FROM  TAB1 RIGHT OUTER JOIN TAB2 ON TAB1.SPALTE1 = TAB2.SPALTE2;

5. Beispiel: Ein Non-Equi-Join

 SELECT * FROM  TAB1 RIGHT OUTER JOIN TAB2 ON TAB1.SPALTE1 > TAB2.SPALTE2;

6. Beispiel: Ein Self-Join

 SELECT * FROM  TAB2 t1 ,  TAB2 t2 WHERE  t1.SPALTE1 = t2.SPALTE2;
 /* Beim SELF JOIN wird die Tabelle in der FROM-Klausel zweimal aufgelistet, 
    dass Schlüsselwort SELF ist nicht vorgesehen.*/

7. Beispiel: Die ON-Klausel kann auch noch zusätzlich durch eine <Suchbedingung> eingeschränkt werden.

 SELECT * FROM     Abteilungen JOIN Angestellte 
       ON Abteilungen.Abt_Nr = Angestellte.Abt_Nr AND Name = 'Produktion' ;

siehe auch: Join-Typ-SQL, Join

Quellen:

Kategorie: SQL, J