# Unterabfrage



## tobi88 (5. Nov 2008)

Moin 

ich habe folgendes Problem:

Ich habe 2 Tabellen


```
Fahrzeug
ID  Fahrzeugkennzeichen  Baujahr

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



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


```
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 (5. Nov 2008)

Moin,

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


Gruesse


----------



## tobi88 (5. Nov 2008)

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?


----------



## FenchelT (5. Nov 2008)

tobi88 hat gesagt.:
			
		

> Das hatte ich auch schon probiert. Funktioniert, aber nur eingeschränkt
> Benutze Left Join



Dann zeig doch mal, was Du schon hast.


----------



## tobi88 (5. Nov 2008)

```
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 (5. Nov 2008)

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:


```
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 (5. Nov 2008)

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:


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


----------

