In der obigen Tabelle sind nur Ausgabezeilen enthalten, welchen genau eine Zeile der Detailtabelle
entspricht. Dies gilt allgemein: Die Gruppierung nach fkey schließt es aus, daß ein fkey in mehreren Ergebniszeilen
gleichzeitig vorkommt. Die Verwendung einer problemangepaßten Aggregatfunktion (MIN, MAX) gibt innerhalb dieser
Teilmenge einen eindeutigen Wert zurück, so daß die Kombination aus fkey und Wert der Aggregatfunktion für diese
Gruppe eindeutig ist.
Also kann diese Tabelle als Unterabfrage für einen INNER JOIN verwendet werden, um die tatsächlich
gewünschten inhaltlichen Werte zu erhalten - der zu diesem Datum gehörende Preis.
SELECT A.*
FROM tbl_Details As A INNER JOIN
(SELECT B.fkey, Max(B.Datum) As [Max-Datum]
FROM tbl_Details As B
GROUP BY B.fkey) As C
ON A.fkey = C.fkey And
A.Datum = C.[Max-Datum]
Diese Abfrage liefert nur noch die beiden folgenden Zeilen als Ergebnis:| id | fkey | A-Preis | Datum |
|---|
| 4 | 35 | 44.50 | 02.07.2004 |
| 8 | 38 | 129.80 | 01.06.2004 |
Nun sind jedoch alle Spalten einschließlich der Primärschlüssel dieser Tabelle im
Ausgabe-Resultset enthalten. Ferner ist die Spalte 'fkey' alleine und in Kombination mit 'Datum' eindeutig, da
aus der ursprünglichen Detailtabelle alle Zeilen für diesen fkey mit Ausnahme dieser Zeile entfernt wurden.
Eine solche Ausgabetabelle kann anschließend bsp. mit der eigentlichen Grundtabelle kombiniert werden, um etwa
Artikelnamen oder die Hausnummern auszugeben, in welchen die Zähler installiert sind. Heißt diese Tabelle tbl_Artikel,
so liefert die folgende Abfrage dieses Ergebnis:
SELECT E.[Artikel-Nummer], E.[Artikel-Name],
A.Datum, A.[A-Preis]
FROM (tbl_Artikel As E Inner Join tbl_Details As A
ON E.[Artikel-Nummer] = A.fkey) INNER JOIN
(SELECT B.fkey, Max(B.Datum) As [Max-Datum]
FROM tbl_Details As B
GROUP BY B.fkey) As C
ON A.fkey = C.fkey And
A.Datum = C.[Max-Datum]
Beachten Sie, daß die zur Kenntlichmachung vergrößert dargestellten Klammern
im Anschluß an FROM nur bei Datenbanksystemen wie Access notwendig sind, welche implizite Klammerungen nicht
unterstützen. Beim Ms-Sql-Server kann und sollte auf eine solche Klammerung verzichtet werden. Unterabfragen
müssen dagegen immer geklammert werden, unabhängig vom verwendeten System.
Damit ist die ursprüngliche Aufgabenstellung zunächst vollständig für den Fall des letzten Eintrags gelöst.