Problem mit SQL-Ausdruck
-
Hallo !
Ich habe eine Tabelle:
personenid (zahl)
datum (datum)
dokument (memo)in der dokumente mit erstellungsdatum abgelegt sind.
ich möchte nun per SQL eine liste
die zu jeder Person das Dokument mit neuestem Datum aufzeigt:Mein Versuch:
SELECT MAX(datum) AS letztesdatum, personenid, dokument FROM tabelle1 GROUP BY personenid
Als Fehler erhalte ich "Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'dokument' nicht als Teil der Aggregatfunktion einschließt.
Das ganze ist eine Access2000 Datenbank.
Ich hoffe ich habe mich nicht zu unverständlich ausgedrückt.
Wie müsste meine Abfrage heissen?Danke,
Smeagol
-
ist dokument richtig geschireben, evtl. hat er probleme mit dem memo typ.. wo ich zwar nich glaube...
SELECT * FROM tabelle1 GROUP BY personenid
geht sowas?
-
Woher soll das DBMS denn wissen, welches Dokument Du selektieren willst? Wenn Du dir
dokument
anzeigen lassen möchtest, musst Du auch danach gruppieren, sonst gibt es ja mehrere dokument-Werte für jeden Datensatz. Oder Du wendest irgendeine Aggregatfunktion auf dokument an, um nur einen Wert zu erhalten.Überleg Dir einfach nochmal, was Du machen möchtest, dann sollte das recht einfach sein.
-
ich möchte natürlich gerne das dokument, welches im selben Datensatz steht, wie das gefundene Datum.
ich erinnere mich aufgrund boris' posting, dass es irgendein problem mit dem gruppieren gab, wenn es ein memo feld war.
aber nicht mehr, ob man's lösen konnte...Oder Du wendest irgendeine Aggregatfunktion auf dokument an, um nur einen Wert zu erhalten.
ich werd's mal ausprobieren, vllt. kommt ja doch was
edit:
ääähmm.. aber welche Funktion sollte ich denn verwenden, die mir dann auch den zugehörigen wert liefert?
-
Zuerst braucht er eine eindeutigere Definition von "Neuestes Dokument". PersonenId + Datum liefert bereits falsche Ergebnisse wenn es bei einer Person mehrere Docs zu einem Datum gibt. Anschliessend könnte man sowas machen
select * from dokumente where DOCID in (select max(DOCID) as DOCID from dokumente group by PersonenID)
Wobei DOCID hier mit einer fortlaufenden Nummer gefüllt werden sollte, so das die aktuellsten Dokumente jeweils die höchste Nummer erhalten. Vielleicht gehts auch einfacher? Weiss leider nicht, wie es um die "Fähigkeiten"
von Access bestellt ist
-
Ich würde hier einen Subselect verwenden, gibt ja schließlich keine passende Aggregatfunktion. Du kannst nicht nur mit den gesammelten Werten der dokument-Spalte herausfinden, welches davon für Dich interessant ist.
Du wirst doch einen anderen Primärschlüssel als nur Person+Datum haben, oder?
Wenn nicht (und das wirklich eindeutig ist), dann brauchst Du einen Subselect, wo Du nach aktuellsten Daten und Personen-ID gruppierst. Dann kannst Du in der WHERE-Klausel die passende Abfrage formulieren (Datum >= ALL + subselect) hilft.
-
Cpp_Junky: Ich würde mich nicht darauf verlassen, dass die DocID immer größer wird. Ist zwar prinzipiell sicher sinnvoll, sowas einzuführen, aber er hat doch schon das Datum gespeichert, insofern wäre es durchaus klug, das auch für die Abfragen zu verwenden.
-
Smeagol schrieb:
ich erinnere mich aufgrund boris' posting, dass es irgendein problem mit dem gruppieren gab, wenn es ein memo feld war.
aber nicht mehr, ob man's lösen konnte...Puh, musste seit Jahren kein Access mehr verwenden, keine Ahnung, was Memo ist.
-
Quasi so (ohne "select in", weil schneller) :
select d1.personenid, max(d1.datum) as LetztDat, (select d2.document from dokumente d2 where d2.personenid = d1.personenid and d2.datum = max(d1.datum)) as DOC from dokumente d1 group by d1.personenid
Das knallt natürlich, sobald es mehr als ein Doc pro Person pro Tag gibt. Man kann dann natürlich mogeln:
... max((select d2.document from dokumente d2 where d2.personenid = d1.personenid and d2.datum = max(d1.datum))) as DOC ...
-
irgendwie haben die geposteten tips nicht so recht geklappt (access meldet fehler)
nach längerem nachdenken bin ich nun zu folgender Idee gekommen.ich selektiere zunächst das grösste datum zu jeder person
und verknüpfe das ergebnis als virtuelle tabelle (vt) mit der ursprungstabelle
über die beiden gefundenen felder.sieht dann so aus:
SELECT vt.personenid, vt.letztes, f1.dokument FROM dokumente AS f1 RIGHT JOIN ( SELECT max(f2.datum) AS letztes, f2.personenid FROM dokumente AS f2 GROUP BY f2.personenid ) AS vt ON ( f1.personenid = vt.personenid AND f1.datum = vt.letztes )
bis jetzt is mir auch noch kein fehler aufgefallen. wird sich dann zeigen
ich danke euch, für eure Anregungen,
Smeagol