INNER JOIN und WHERE-Attribute

Mischa Sameli, Geschäftsführer & Leiter Entwicklung

Für mich Erstaunliches, aber vermutlich Logisches hat wieder einmal das aktuelles Projekt zutage gebracht. Und zwar musste ich feststellten, dass WHERE-Klauseln in SQL-Statements unerwartete Resultate liefern können.

Bei einer Datenbank-Abfrage wollte ich alle Werte eines Bestimmten Typs herausfinden und sortieren lassen anhand der Sortierung, die in der Typ-Tabelle eingetragen ist. Dazu habe ich folgendes Query benutzt:

1SELECT a.dscWert FROM beitrag_felder_join a
2INNER JOIN feld_objekt_join b ON a.Feld_ID = b.Feld_ID
3WHERE a.idxDummy = 0
4    AND a.Objekt_ID = #objID#
5    AND a.Beitrag_ID = #beitragID#
6ORDER BY b.intSort

Das Ergebnis sollte alle 5 Felder (dscWert) des Objekts Autor zurückliefern, und zwar sortiert nach der Sortierung in der Objekte-Tabelle. Das Resultat bestand aber aus 9 Einträge, nicht nur deren 5. Weshalb? Der INNER JOIN geht über die Feld_ID und die kommt in der zweiten Tabelle mehrmals vor für andere Objekte. Der Versuch, die beiden Tabellen über die Objekt_ID zu Verbinden scheitert ebenso:

1SELECT a.dscWert FROM beitrag_felder_join a
2INNER JOIN feld_objekt_join b ON a.Objekt_ID = b.Objekt_ID
3WHERE a.idxDummy = 0
4    AND a.Objekt_ID = #objID#
5    AND a.Beitrag_ID = #beitragID#
6ORDER BY b.intSort

Jetzt werden nämlich noch mehr Zeilen ausgelesen. Erst die richtige Abfrage in der WHERE-Klausel brachte das erwünschte Resultat:

1SELECT a.dscWert FROM beitrag_felder_join a
2INNER JOIN feld_objekt_join b ON a.Feld_ID = b.Feld_ID
3WHERE a.idxDummy = 0
4    AND b.Objekt_ID = #objID#
5    AND a.Beitrag_ID = #beitragID#
6ORDER BY b.intSort

Ein kleines Detail, aber wichtig zu wissen.