Hallo Jörg,
das ist mühsam und hässlich. Und ich nehme an, du möchtest auch eine Spalte2 aus table2 haben, sonst kannst Du auf den Join verzichten 😉
Du kannst mit einer Zusatzklausel den JOIN auf das jüngste Datum limitieren:
SELECT t1.ID1, t1.Spalte1, t2.ID2, t2.Spalte2
FROM table1 t1
LEFT JOIN table2 t2 ON t1.ID1 = t2.ID1
AND t2.Datum = (SELECT MAX(Datum)
FROM table2
WHERE id = t1.ID1)
Keine Ahnung wie gut der SQL Server das optimiert, das muss man messen. Ein Index, der ID2 und Datum enthält, ist vermutlich hilfreich.
Eine weitere Alternative wäre, die Query zu teilen. Zuerst nur table1 lesen, dann table2, mit einem ORDER BY nach Datum absteigend, und einem Limit auf den ersten Treffer. Das sind dann zwei Queries an die DB - mit Hilfe einer Routine (Stored Procedure) könnte man ggf. erreichen, dass man nur einen Roundtrip zum DB Server braucht. Aber das lohnt vermutlich nur, wenn der auf einem separaten Computer läuft.
Die Alternative ist Postprocessing des Query-Ergebnisses in der Programmiersprache. Wenn es in table2 viele Sätze zu einer ID gibt, ist die MAX-Query vermutlich besser. Das lässt sich nur in deiner konkreten Umgebung beobachten und messen.
Rolf
sumpsi - posui - obstruxi