Hallo ihr,
nachdem ich meine Access-Datenbank zum MS SQL Server 2008 Express migriert habe, funktioniert leider der SQL-Befehl "First" / "Last" nicht mehr. Ich habe jetzt verzweifelt überall im Internet nach einer Lösung gesucht, bin aber nicht wirklich weitergekommen. Irgendwie müßte es mit einem "Subselect" oder "Subquery" funktionieren - aber die bereits ausprobierten Codes gingen nicht.
Zur Problemstellung:
Ich habe eine Tabelle Personen, eine Tabelle PersEmail und eine Tabelle Emailadressen. In erster sind klar alle Personen, in zweiter eine M:N-Verknüpfung zwischen Personen und Emailadressen und in dritter die Emailadressen selbst.
Bsp (vereinfacht):
----
[Personen]
[Felder: Pers_ID / Pers_Nachname / Pers_Vorname]
1 / Meier / Karl
2 / Huber / Heinz
3 / Schmidt / Klaus
4 / Meier / Claudia
5 / Müller / Reiner
----
[PersEmail]
[Felder: PersEmail_ID / Pers_ID / Email_ID / Letzte_Änderung]
1 / 1 / 1 / 01.01.2008
2 / 3 / 2 / 20.10.2008
3 / 1 / 3 / 30.10.2008
4 / 2 / 4 / 21.10.2008
5 / 4 / 1 / 02.01.2008
----
[Emailadressen]
[Felder: Email_ID / Email_Adresse]
1 / familie.meier@gmx.de
2 / klaus.schmidt@web.de
3 / karl.meier@yahoo.com
4 / heinz.huber@hotmail.com
----
Was ich brauche ist die aktuelle Emailadresse der Person. Bis dato war das ganze nicht so schwierig. Alle drei Tabellen waren miteinander verknüpft, die M:N-Tabelle nach dem Datum der letzten Änderung der jeweiligen Verknüpfung absteigend sortiert und dann habe ich einfach mit "Erster Wert" die aktuellste Emailadresse rausgesucht.
Bsp. gewünschtes Trefferergebnis:
[Felder: Pers_ID / Pers_Nachname / Pers_ Vorname / Email_ID / Email_Adresse / Letzte_Änderung]
1 / Meier / Karl / 3 / karl.meier@yahoo.com / 30.10.2008
2 / Huber / Heinz / 4 / heinz.huber@hotmail.com / 21.10.2008
3 / Schmidt / Klaus / 2 / klaus.schmidt@web.de / 20.10.2008
4 / Meier / Claudia / 1 / familie.meier@gmx.de / 02.01.2008
----
Mit dem SQL-Server funktioniert jetzt "First" und "Last" leider nicht mehr. Ich habe jetzt schon diverse Lösungen mit "Top 1" durch - allerdings bekomme ich dann immer nur die erste Person angezeigt. Alle Versuche das "TOP 1" irgendwo in den Code zu bringen um zu zeigen, dass ich nur bei der Emailadresse den ersten Wert angezeigt bekommen will half leider nicht.
Wenn man mit einer Gruppierung arbeitet, dann kann man zwar bei "Letzte_Änderung" mit Max() den höchsten Wert herausfinden - allerdings muss man dann Email_ID auch mit in die Gruppierung reinnehmen. Nimmt man hier auch Max(), dann sucht er alphabetisch den höchsten oder niedrigsten Wert heraus (bei Min()). Wählt man bei der Email_ID hingegen Group by, dann tauchen im Trefferergebnis wieder alle Emailadressen der Person auf.
Es wäre wirklich supergenial, wenn irgendjemand hier eine Lösung wüßte. An sich kann es keine große Sache sein.
Stefan
Hier der (vereinfachte) Access-Code, der wunderbar funktionierte...:
nachdem ich meine Access-Datenbank zum MS SQL Server 2008 Express migriert habe, funktioniert leider der SQL-Befehl "First" / "Last" nicht mehr. Ich habe jetzt verzweifelt überall im Internet nach einer Lösung gesucht, bin aber nicht wirklich weitergekommen. Irgendwie müßte es mit einem "Subselect" oder "Subquery" funktionieren - aber die bereits ausprobierten Codes gingen nicht.
Zur Problemstellung:
Ich habe eine Tabelle Personen, eine Tabelle PersEmail und eine Tabelle Emailadressen. In erster sind klar alle Personen, in zweiter eine M:N-Verknüpfung zwischen Personen und Emailadressen und in dritter die Emailadressen selbst.
Bsp (vereinfacht):
----
[Personen]
[Felder: Pers_ID / Pers_Nachname / Pers_Vorname]
1 / Meier / Karl
2 / Huber / Heinz
3 / Schmidt / Klaus
4 / Meier / Claudia
5 / Müller / Reiner
----
[PersEmail]
[Felder: PersEmail_ID / Pers_ID / Email_ID / Letzte_Änderung]
1 / 1 / 1 / 01.01.2008
2 / 3 / 2 / 20.10.2008
3 / 1 / 3 / 30.10.2008
4 / 2 / 4 / 21.10.2008
5 / 4 / 1 / 02.01.2008
----
[Emailadressen]
[Felder: Email_ID / Email_Adresse]
1 / familie.meier@gmx.de
2 / klaus.schmidt@web.de
3 / karl.meier@yahoo.com
4 / heinz.huber@hotmail.com
----
Was ich brauche ist die aktuelle Emailadresse der Person. Bis dato war das ganze nicht so schwierig. Alle drei Tabellen waren miteinander verknüpft, die M:N-Tabelle nach dem Datum der letzten Änderung der jeweiligen Verknüpfung absteigend sortiert und dann habe ich einfach mit "Erster Wert" die aktuellste Emailadresse rausgesucht.
Bsp. gewünschtes Trefferergebnis:
[Felder: Pers_ID / Pers_Nachname / Pers_ Vorname / Email_ID / Email_Adresse / Letzte_Änderung]
1 / Meier / Karl / 3 / karl.meier@yahoo.com / 30.10.2008
2 / Huber / Heinz / 4 / heinz.huber@hotmail.com / 21.10.2008
3 / Schmidt / Klaus / 2 / klaus.schmidt@web.de / 20.10.2008
4 / Meier / Claudia / 1 / familie.meier@gmx.de / 02.01.2008
----
Mit dem SQL-Server funktioniert jetzt "First" und "Last" leider nicht mehr. Ich habe jetzt schon diverse Lösungen mit "Top 1" durch - allerdings bekomme ich dann immer nur die erste Person angezeigt. Alle Versuche das "TOP 1" irgendwo in den Code zu bringen um zu zeigen, dass ich nur bei der Emailadresse den ersten Wert angezeigt bekommen will half leider nicht.
Wenn man mit einer Gruppierung arbeitet, dann kann man zwar bei "Letzte_Änderung" mit Max() den höchsten Wert herausfinden - allerdings muss man dann Email_ID auch mit in die Gruppierung reinnehmen. Nimmt man hier auch Max(), dann sucht er alphabetisch den höchsten oder niedrigsten Wert heraus (bei Min()). Wählt man bei der Email_ID hingegen Group by, dann tauchen im Trefferergebnis wieder alle Emailadressen der Person auf.
Es wäre wirklich supergenial, wenn irgendjemand hier eine Lösung wüßte. An sich kann es keine große Sache sein.
Stefan
Hier der (vereinfachte) Access-Code, der wunderbar funktionierte...:
Code:
SELECT P.Pers_ID, First(P.Pers_Nachname) AS ErsterWertvonPers_Nachname,
First(P.Pers_Vorname) AS ErsterWertvonPers_Vorname,
First(E.Email_Letzte_Änderung) AS ErsterWertvonEmail_Letzte_Änderung,
First(E.Email_ID) AS ErsterWertvonEmail_ID,
First(E.Email_Adresse) AS ErsterWertvonEmail_Adresse
FROM (PersEmail AS PE
RIGHT JOIN Personen AS P
ON PE.Pers_ID = P.Pers_ID)
LEFT JOIN Emailadressen AS E
ON PE.Email_ID = E.Email_ID
GROUP BY P.Pers_ID
ORDER BY P.Pers_ID, First(E.Email_Letzte_Änderung) DESC;
Zuletzt bearbeitet: