Zum Inhalt springen

SQL-Abfrage/Access/Subselect ...


Schledo

Empfohlene Beiträge

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 :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

:( 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 :-(

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...