Mehrere Tabellen in einem Query; die verschiedenen Ansätze von Joins

Auflisten oder „sauber joinen“? Eine Frage, die die Welt bewegt?

Es gibt mehrere Ansätze, ein SQL Query zu schreiben, welches über mehrere Tabellen Daten zusammenzieht.
Ein technisches „Richtig“ oder „Falsch“ gibt es nicht im eigentlichen Sinne, allerdings entbrennen hier oder da schon fast Glaubenskriege, wie ein sauberes Query auszusehen hat.

Nicht selten wird  auch die Performance als Argument ins Feld geführt. Dazu kommen wir in einem späteren Blog.

Was ist denn der Unterschied?

Variante mit Datenquellenliste

Der eine Ansatz geht dahin, dass die als Datenquellen benötigten Tabellen in einer Liste nach dem „FROM“ Schlüsselwort aufgeführt werden:

Der zweite Ansatz verwendet das Schlüsselwort JOIN um anzuzeigen, dass die folgende Datenquelle mit der bereits erwähnten auf irgendeine Weise verknüpft werden soll:

Variante mit JOIN

Wo liegt denn das Problem?

In der Grössenordnung der oben gezeigten Queries sind auch optisch kaum Unterschiede auszumachen; das Komma wurde durch das Schlüsselwort JOIN ersetzt und die WHERE Klausel durch das Schlüsselwort ON.

Variante mit Datenquellenliste

Etwas anders sieht es aus, wenn mehrere Tabellen verknüpft werden müssen, was in einem grösseren Datenmodell in der 3. Normalform (3NF) durchaus vorkommen kann:

Variante mit JOIN

Nun kann man der Meinung sein, dass die Tabellenliste viel eleganter aussieht und mit viel weniger Text und Zeilen auskommt.
Das ist im Grundsatz nicht falsch, aber man sollte sich auch vergegenwärtigen, dass ein Query in seiner Lebensdauer sich verändert. Selten kommt es hier zu einer Reduktion in der Komplexität.

Wenn also noch weitere Datenquellen hinzukommen, vielleicht sogar nach dem Grundsatz, dass nicht zu jedem Datensatz der schon selektiert ist, ein Datensatz in der neuen Datenquelle stehen muss (LEFT JOIN oder RIGHT JOIN), dass wird es interessant und tendiert je nach Sauberkeit des Autors des Queries dazu, unübersichtlich zu werden.
Genauso umständlich, wie der vorangegangen Satz ist dann das Query zu lesen…

Ebenso wird es spätestens nach der zehnten eingebundenen Datenquelle fast ein Ding der Unmöglichkeit, noch auf einen Blick zu sehen, ob wirklich alle relevanten Verknüpfungen getätigt sind, damit es nicht zu einem kartesischen Produkt kommt.

Zum Dessert hier noch ein kleiner Vergleich, wenn zwei, drei LEFT JOINs mit einfliessen müssen.

Variante Datenquellenliste
Variante JOIN

Es muss hierbei beachtet werden, dass aus syntaktischen Gründen (zumindest bei MS SQL Server) die LEFT JOINS bei den Tabellen angesiedelt werden müssen, mit denen sie verknüpft werden sollen, da ansonsten die entsprechenden Aliase nicht verfügbar sind. Wenn man also einen LEFT JOIN implementieren muss, bei dem mehr als nur gerade die vorangegangene Tabellen verknüpft werden soll, kommt man kaum um die Implementation einen (INNER) JOINS herum.

Konklusion

Da bei steigender Komplexität des Queries, insbesondere bei der Implementation von LEFT (OUTER) JOINs, es ohnehin gezwungenermassen zur Verwendung von (INNER) JOINs kommt, rate ich zur konsequenten Verwendung von „sauberen“ JOINs, da sich das Query bei einer späteren Anpassung einfacher liest und die JOIN Bedingungen direkt bei den entsprechenden verknüpften Datenquellen.

Im weiteren erreicht man auf diese Weise eine gewisse Einheitlichkeit im Coding und somit auch für dritte Personen, welche die Queries zu späteren Gelegenheiten warten müssen, eine verbesserte Lesbarkeit der Statements.

 

 

Beitrag teilen

Jimmy Rüedi

IT Enthusiast seit 1992 // IT Profi seit 1997 // Datenbank Spezialist seit 2000

Alle Beiträge ansehen von Jimmy Rüedi →

Schreibe einen Kommentar