Structured Query Language (SQL)
Sie sind hier: Startseite › Structured Query Language › Tabellenverknüpfung
CM, 01.09.2001
Tabellenverknüpfung
Allgemeine Einsatz- und Wirkungsweise
Mehrere Tabellen können in einer einzelnen SELECT
-Anweisung verknüpft
werden.
SELECT * FROM <Tabellenname1>, <Tabellenname2>;
Der Nachteil einer derartigen Formulierung:
In der Ausgabe wird jede Zeile der einen Tabelle mit jeder Zeile der anderen Tabelle verknüpft. Man erhält das sogenannte kartesische Produkt. Bei einer Tabelle mit 300 Zeilen Umfang, die mit 200-Zeilen-Umfang-Tabelle verknüpft wird, erhält man eine Ergebnistabelle mit einem Umfang von 60.000 Zeilen (300 × 200)!
Diese Art der Verknüpfung nennt man Cross Join (Join: englisch für Verknüpfung).
Sie demonstriert die grundlegende Kombinationseigenschaft aller Verbundtypen, das Zusammenbringen von Tabellen durch Verknüpfungen.
Problem der gleichen Spaltenbezeichnung
Bei der Verknüpfung von Tabellen steht man oftmals vor dem Problem, dass verschiedene Spalten unterschiedlicher Tabellen gleichbenannt sind. Hier werden Aliasnamen eingesetzt.
Das heißt konkret: Jede Tabelle bekommt einen Buchstaben zugewiesen (im nachfolgenden Beispiel A und B). Alle Spalten der Tabelle A bekommen dann ebenfalls ein A, Spalten der Tabelle B dementsprechend ein B zugewiesen. Doppelte Spaltennamen können so getrennt werden. Zur besseren Übersicht in späteren Situationen sollten in diesen Fällen alle Spalten mit dem Alias gekennzeichnet werden, auch die nur einfach vorkommenden Spaltenbezeichnungen.
SELECT <A.Spaltenname1>, <A.Spaltenname2>, <A.Spaltenname3>, <B.Spaltenname4>, <B.Spaltenname1>, <B.Spaltenname2>
FROM <Tabellenname1 A>, <Tabellenname2 B>;
Mit dem Buchstaben A werden alle Tabelle-A-Spalten spezifiziert, mit B alle Tabelle-B-Spalten.
Equi Joins
Werden Tabellen über die Gleichheit gleichlautender Spalten verknüpft, so spricht man von Equi Join-Verknüpfungen (Gleichverbund).
SELECT <C.Spaltenname1>, <C.Spaltenname2>, <A.Spaltenname3> * <B.Spaltenname4> <Neuer
Spaltenname>,
<B.Spaltenname5>
FROM <Tabellenname1 A>, <Tabellenname2 B>, <Tabellenname3 C>
WHERE <A.Spaltenname6> = <B.Spaltenname6>
AND <A.Spaltenname1> = <C.Spaltenname1>
ORDER BY <C.Spaltenname1>;
Das Ergebnis ist eine Liste aus drei Verknüpften Tabellen A, B und C.
Diese Liste ist aufsteigend nach Spaltenname1 der C-Tabelle sortiert.
Sie enthält alle Datensätze, bei denen Inhalte der Tabelle A in Spaltennamen6 gleich der Inhalte der gleichnamigen Spalte in Tabelle B sowie alle Inhalte aus Spaltenname1 der Tabelle A gleich den Inhalten der gleichnamigen Spalte aus Tabelle C sind.
Desweiteren werden die Inhalte der Spalte3 aus Tabelle A mit den
Spalteninhalten4 der Tabelle B multipliziert und in einer <Neuer
Spaltenname>
-Spalte ausgegeben. Voraussetzung ist hier
natürlich, dass sich um numerische Felder handelt, da sonst
dieser Rechenvorgang eine Fehlermeldung erzeugen würde.
Non-Equi Joins
Bei der Equi Join steht
das Gleichheitszeichen in der WHERE
-Anweisung. Für alle
anderen Operatoren verwendet man die Non-Equi Join.
SELECT <A.Spaltenname1>, <A.Spaltenname2>, <B.Spaltenname2>, <A.Spaltenname3> * <B.Spaltenname4> <Neuer
Spaltenname>
FROM <Tabellenname1 A>, <Tabellenname2 B>
WHERE <A.Spaltenname2> > <B.Spaltenname2>;
Selbstbezogene Tabellenverknüpfung
Zur Überprüfung der internen Datenkonsistenz.
SELECT * FROM <Tabelle1>, <Tabelle1>;
Um zu überprüfen, ob Daten (wie z.B. Bestellnummern zu bestimmten Artikeln) mehrfach vorkommen (und das eigentlich nicht der Fall sein darf!!!) wandelt man die Abfrage einfach ab.
SELECT <A.Spaltenname1>, <A.Spaltenname2>, <B.Spaltenname1>, <B.Spaltenname2>
FROM <Tabelle1 A>, <Tabelle1 B>
WHERE <A.Spaltenname1> = <B.Spaltenname1>
AND <A.Spaltenname2> <> <B.Spaltenname2>;
Ausgabe: Alle Datensätze, bei denen durch gleichen Inhalt in 1. Spalte verschiedene Inhalte in zweiter Spalte zugewiesen werden.