Unterabfrage

Status
Nicht offen für weitere Antworten.

tobi88

Aktives Mitglied
Moin :)

ich habe folgendes Problem:

Ich habe 2 Tabellen

Code:
Fahrzeug
ID  Fahrzeugkennzeichen  Baujahr

1     KS-AA 123                2008
2     KS-BB 123                2007
3     KS-CC 123               2008


Code:
Prüfung
ID ID_Fahrzeug   Prüfdatum     nächstmöglichesPrüfdatum  Bestanden

1   1                   01.01.08        01.05.08                            nein
2   1                   01.04.08        01.04.09                            ja    
3   1                   01.06.09        01.07.09                            nein    
4   2                   01.01.03        01.01.04                            nein    
5   2                   01.06.04        01.07.09                            nein


Nun möchte ich alle Fahrzeuge nur einmal auflisten mit dem spätesten Prüfdatum und mit dem spätesten Prüfdatum.

Die Tabelle sollte dann so aussehen:

Code:
ID   Fahrzeugkennzeichen   Baujahr  Prüfdatum   nächstmöglichesPrüfdatum   Bestanden
1        KS-AA 123                2008      01.06.09        01.07.09                            nein
2        KS-BB 123                2007      01.06.04        01.07.09                            nein    
3        KS-CC 123                2008

Fahrzeug 3 auch anzeigen!!! auch wenn keine Prüfung erzeugt wurden ist.

Ich dachte mir, dass man das mit einer Unterabfrage am besten Lösen konnte. Ich bekomme es leider nur nicht hin :(

Meine erste Idee war das Problem mit einem Limit zu lösen. Eine Limitabfrage auf die Prüfungstabelle, und dann einen Join auf die Fahrzeugtabelle. Dachte dann, es wird ein Limit pro Fahrzeugdatensatz ausgeben. Aber damit lag ich leider falsch, er hat mir nur ein Datensatz auf alle Fahrzeuge ausgeben :(

Habt ihr eine Idee für mich? Bin für jede Idee dankbar :)

Gruß
Tobi
 

FenchelT

Bekanntes Mitglied
Moin,

versuch es mal ueber einen Outer Join i.V.m. der Aggregatfunktion max() und einem GroupBY


Gruesse
 

tobi88

Aktives Mitglied
Das hatte ich auch schon probiert. Funktioniert, aber nur eingeschränkt :(
Benutze Left Join

Sobald ich einen weiteren Eintrag aus der Prüftabelle in den Select nehme, werden mir wieder alle Datensätze angezeigt. muss dann max für prüfdatum, nprüfdatum, usw angeben.

Das geht doch bestimmt geschickter oder?

Kann ich nicht einfach mit einer Unterabfrage, mir nur einen Datensatz von der Prüftabelle herraus suchen und diese dann mit der Fahrzeugtabelle verknüpfen?
 

tobi88

Aktives Mitglied
Code:
SELECT Max(Year([NaechstmoeglicherAbnahmeTermin])) AS nJahr, Max(Month([NaechstmoeglicherAbnahmeTermin])) AS nMonat, Max(Day([NaechstmoeglicherAbnahmeTermin])) AS nTag, Fahrzeug.ID, Fahrzeug.Kennzeichen, Fahrzeug.SerialNr, Fahrzeug.Baujahr, Fahrzeug.Bemerkung, [nJahr] & "." & Format([nMonat],"00") & "." & Format([nTag],"00") AS nDatum
FROM Fahrzeug LEFT JOIN Pruefung ON Fahrzeug.ID = Pruefung.ID_Fahrzeug
GROUP BY Fahrzeug.ID, Fahrzeug.Kennzeichen, Fahrzeug.SerialNr, Fahrzeug.Baujahr, Fahrzeug.Bemerkung;

Das ist meine SQL-Statement. Damit geht schon das mit dem nächstmöglichen Datum. Um jetzt das Prüfdatum noch dazu zu bekommen, muss ich wieder das so machen, wie ich das mit dem nächstmöglcihen Datum gemacht habe. Und wenn ich dann beispielsweise noch in den select schreibe, Pruefung.aufrahmzeit, dann werden mir wieder alle daten in der abfrage angezeigt :(
 

FenchelT

Bekanntes Mitglied
Hi,

sry, habe den ganzen Tag in einer Besprechung gesessen.

Ich verstehe nicht, warum Du max(year()), max(month(), usw benutzt.
Du hast doch in Deinem Ausgangspost gesagt, Du moechtest das ganze als ein Datum

Also
SELECT max(Pruefdatum) as Pruefdatum


Alle weiteren Felder die Du selektierst benoetigst Du dann auch aggregiert.
Die packst Du dann zusaetzlich in ein GROUP BY

Also
SELECT max(Pruefdatum) as Pruefdatum, ID, naech.-Pruefdatum
FROM...
...
GROUP BY ID, naech.-Pruefdatum.



alternativ geht auch folgendes, ich weiss aber nicht ob das von mySQL unterstuetzt wird und aufgrund Deiner LIMIT Erwaehnung gehe ich davon aus, dass Du mySQL einsetzt:

Code:
SELECT a.id, tmp.Pruefdatum, a.naechstpruefdatum
FROM (
           SELECT id, max(pruefdatum) as Pruefdatum Group BY id
    ) tmp

LEFT JOIN deine_tabelle a ON a.id = tmp.id
LEFT JOIN deine_zweite_Tabelle .....


Gruesse
 

tobi88

Aktives Mitglied
Ich bin benutze gerade ms access. komme oft durcheinander mit den ganzen servern. haben hier an der arbeit so viele verschiedene stehen. danke für die antwort :) und brauchst dich doch nicht zu entschuldigen, dass du erst so spät schreibst. ich habe jetzt eine lösung auf mein problem gefunden :)

und zwar so:

Code:
SELECT Fahrzeug.ID, Fahrzeug.Kennzeichen, Fahrzeug.SerialNr, Fahrzeug.Baujahr, Pruefung.Pruefungsdatum, Pruefung.NaechstmoeglicherAbnahmeTermin
FROM ([SELECT Fahrzeug.ID AS ID_Fahrzeug, Max(Pruefung.Pruefungsdatum) AS MaxPruefungsdatum
FROM Pruefung RIGHT JOIN Fahrzeug ON Pruefung.ID_Fahrzeug = Fahrzeug.ID
GROUP BY Fahrzeug.ID ]. AS abf_Overview_unter LEFT JOIN Fahrzeug ON abf_Overview_unter.ID_Fahrzeug = Fahrzeug.ID) LEFT JOIN Pruefung ON (abf_Overview_unter.ID_Fahrzeug = Pruefung.ID_Fahrzeug) AND (abf_Overview_unter.MaxPruefungsdatum = Pruefung.Pruefungsdatum)
ORDER BY Fahrzeug.Kennzeichen;

da werden mir alle fahrzeuge angezeigt, die keine prüfung haben und kommen nur einmal vor :)

-habe eine tabelle, wo ich das maximal datum jedes fahrzeuges herraus finde.
-verknüpfe nun id fahrzeug mit id_fahrzeug UND maxpreufung mit pruefdatum


vielen dank für eure hilfe

:)
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben