Structured Query Language (SQL)

Sie sind hier: StartseiteStructured Query LanguageTabellenverknüpfung

CM, 01.09.2001

Tabellenverknüpfung: Tabellenverknüpfung (Allgemeine Einsatz- und Wirkungsweise, Problem der gleichen Spaltenbezeichnung, Equi Joins, Non-Equi Joins, Selbstbezogene Tabellenverknüpfung).

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.