Schledo Geschrieben 25. August 2005 Teilen Geschrieben 25. August 2005 Hallo, ich greife aus PHP über ODBC erfolgreich auf eine Access-Datenbank zu, aber so oder direkt ist ja eigentlich irrelevant. Einfache SELECTs, INSERTs und UPDATEs funktionieren tadellos. Bei einer etwas "komplexeren" (ich will das mal so nennen) SELECT-Anweisung stecke ich nun aber schon viel zu lange fest :-( Ich habe folgendes (im Sinn vereinfachtes, d.h. für die Darstellung hier in Feldern auf das Notwendigste minimierte) Datenmodell: Tabelle1: - id (Primärschlüssel) - TextA1 - TextA2 ... Tabelle2: - Tabelle1_id (Fremdschlüssel) - Datum1 - TextB Wie man evtl. vermutet ist es eine gewöhnliche 1:n-Beziehung. Nun möchte ich folgende Abfrage generieren: Es sollen mir alle Datensätze (mit allen Feldern) aus Tabelle1 ausgegeben werden und zusätzlich dazu, das jeweilige Feld Datum1 und TextB aus Tabelle2 zum entsprechenden Datensatz aus Tabelle1, welche das "jüngste" (sprich aktuellste) Datum aus Tabelle2 beinhaltet. Und nur dieses Feld. Und genau das mit dem nur jüngsten Datum und dazugehörigem(!) Befund hat bisher nicht wirklich funktioniert. Hintergrund: Es soll quasi eine Liste generiert werden, in welche Geräte (Tabelle1) mit Ihrer jeweils letzten/aktuellsten Prüfung (Datum1) und einem dazugehörigen Text (TextB) ausgegeben werden. Mir bekannte SUBSELECTs, JOINs, GROUP BYs, MAXs, ... und was weiss ich nicht noch alles haben bisher nicht zum Ergebnis geführt und ich bin bald am verzweifeln. Ich kenne mich mit Datenbanken eigentlich gut aus, nur eben nicht mit Access, das offensichtlich alles ein wenig anderst haben will, als ich es gewohnt bin. Ich will quasi sowas (vom Sinn her): SELECT id, TextA1, TextA2, ( ... dazugehöriges jüngstes Datum aus Tabelle2 ...) AS letzte_Wartung, ( ... entsprechend des Datums dazugehöriger Befund aus Tabelle2 ...) AS Befund FROM Tabelle1 ORDER BY TextA1 Vielen Dank schon jetzt für rasche und lösende Antworten! Wenn ich das nicht bald hinbekomme ... muss ich noch eine Belohnunh aussetzen :hells: Hilfe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schledo Geschrieben 25. August 2005 Autor Teilen Geschrieben 25. August 2005 Auch wenn mir meine aktuelle und sogar funktionierende(!) Lösung wegen der beiden identischen ORDER BYs in den SUBSELECTs nicht unbedingt gefällt, ist dies gerade mein aktueller Stand zum Problem: SELECT id, TextA1, TextA2, (SELECT TOP 1 Datum FROM Tabelle2 WHERE Tabelle1_id = Tabelle1.id ORDER BY Datum DESC) AS lastDatum, (SELECT TOP 1 Text FROM Tabelle2 WHERE Tabelle1_id = Tabelle1.id ORDER BY Datum DESC) AS TextB FROM Prüfgerät; Diese Abfrage funktioniert und bringt mir zunächst teils das gewünschte Ergebnis, aber ich kann keinen ORDER BY auf lastDatum am Ende anwenden ?, das ist nun quasi mein neues bzw. oder ein weiteres Problem Wie kann ich denn nun nach dem in der Abfrage tituliertem "lastDatum" sortieren am Ende der Abfrage? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 26. August 2005 Teilen Geschrieben 26. August 2005 1) ... FROM Tabelle2,Tabelle1 WHERE ... in beiden Subselects 2) kannst du nicht einen subselect machen ? SELECT TOP 1 Datum,Text FROM Tabelle2,Tabelle1 WHERE Tabelle1_id = Tabelle1.id ORDER BY Datum DESC ausserdem würde ich keine Tabelle Prüfgerät nennen, eher Pruefgeraet ob das problem nun geschichte ist, keine ahnung Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schledo Geschrieben 26. August 2005 Autor Teilen Geschrieben 26. August 2005 1) ... FROM Tabelle2,Tabelle1 WHERE ... in beiden Subselects 2) kannst du nicht einen subselect machen ? SELECT TOP 1 Datum,Text FROM Tabelle2,Tabelle1 WHERE Tabelle1_id = Tabelle1.id ORDER BY Datum DESC ausserdem würde ich keine Tabelle Prüfgerät nennen, eher Pruefgeraet 1. FROM Tabelle1 kann ich mir im Subselect sparen, darauf hat er auch so funktionierenden Zugriff. 2. Natürlich würde ich gerne einen Subselect machen, nur wenn ich das auf eine offensichtlich falsche Art und Weise tue, wird mir immer als Fehler gemeldet, dass der Subselect nur einen Wert zurückgeben darf, sowas hier in der Art will quasi nicht: ...Feld ..., (SELECT TOP 1 Datum, TextB FROM Tabelle2 WHERE Tabelle1_id = Tabelle1.id ORDER BY Datum DESC), ...Feld ..., Dennoch bin ich ziemlich sicher, dass es doch möglich sein muss, dass ein Subselect, mehrere Felder zurückgibt? 3. Klar sollte man keine Umlaute, sowie Groß- und Kleinschreibung machen ... hab ich auch nicht, das ist mir jetzt nur so in der deutschen Sprachsyntax zur Erläuterung des Hintergrundes so gewesen :-) 4. Nach wie vor besteht auch noch das beschriebene Problem mit dem ODER BY. Helft mir, die Lösung ist nah :cool: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schledo Geschrieben 26. August 2005 Autor Teilen Geschrieben 26. August 2005 Zu Punkt 4 habe ich gerade herausgefunden, dass ein ORDER BY keine Aliase akzeptiert, d.h. man muss dort quasi den kompletten Ausdruck hinschreiben:You can use a field alias in an expression to calculate the value for another calculated field but you have to use the full expression if you want to Sort, filter or Group by the calcuated value. Das stellt mich aber auch vor ein Problem, weil das Feld nach dem ich sortieren möchte ist ein in der Abfrage erstelltes mit der Funktion DATE_ADD und darin wird ein Alias verwendet. D.h. wo ich vorher in der Abfrage DATE_ADD schon einmal mit Alias verwende geht es natürlich, aber sobald ich diesen kompletten Ausdruck nun ins ORDER BY setze, kennt er selbst den Alias im DATE_ADD nicht mehr ... das stellt mich wirklich vo ein Problem, denn ich muss nach diesem in der Abfrage erstellten Wert/Datum die Gesamtabfrage sortieren ... Selbst der Versuch innerhalb von DATE_ADD nochmals den kompletten vorherigen Subselect einzusetzen (auch wenn es unschön ist) scheitert irgendwie :-( Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schledo Geschrieben 26. August 2005 Autor Teilen Geschrieben 26. August 2005 Problem mit dem ORDER BY ist gelöst! Da ein Einsetzen des kompletten Ausdrucks in ORDERY BY wegen DATEADD(... weitere Aliase die nicht funzen...) nicht wirklich etwas bringt (da dieser wie man sieht wieder Aliase verwendet) bzw. dadurch fast ewig tief verschachtelt werden müsste, habe ich mal in Newsgroups gesucht und was gefunden: Es gibt in Access bzw. der JET-Engine eine meist nicht mehr dokumentierte, als "deprecated" eingestufte Möglichkeit, doch nach inder Query selbst generierten Werten zu sortieren und zwar: ... ORDERY BY n DESC/ASC; Wobei n die Nummer der Spalte (des Feldes) angibt, welche die Query selbst, d.h. der ganze SELECT, zurückgibt. Sprich ich muss lediglich abzählen, welches Feld mein Alias quasi ist und das da einsetzen. Auch wenn es nicht unbedingt leicht durchschaubaur, flexibel oder portabel ist, so erschlägt es doch mein gesamtes Problem mit dem ORDERY BY mit nur einem einzigen Zeichen! Es besteht nun daher nur noch das Problem, wie man aus einem Subselect mehrere Felder eines Datensatzes zurückgibt? Nachtrag: Zu früh gefreut ... die Lösung mit dem ORDER BY funktioniert nicht bei meinem aus DATEADD generiertem Feld, bei den direkt selektierten Feldern schon Zum heulen das ganze ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.