(SQL) Bei Mehrfacheinträgen den aktuellsten?
*Markus
- sonstiges
Guten Abend,
ich habe eine Tabelle "Pruefungen". Dabei haben verschiedene Schüler diverse Fächer belegt und eine Note erhalten. Bei manchen Schülern gibt es aber 2 Noten oder mehr pro Fach. Ich will aber nur die neueste Note in diesem Fach ausgeben lassen (Zeugnis). Wie kann ich das anstellen?
So sieht es jetzt aus:
SELECT P_G_Fach, P_Note, P_Datum FROM pruefungen WHERE P_S_Kandidat = 111;
Die Ausgabe:
AM 4 06.02.06
TDO 4 15.03.06
TDO 1 07.06.06
TDO 1 05.03.07
In diesem Fall will ich also den untersten Eintrag haben, weil dieser das aktuellste Datum hat. Wie bekomme ich eine Ausgabe, die mir
AM 4 06.02.06
TDO 1 05.03.07
ausgibt?
Die Datenbank ist übrigens eine Oracle.
Markus
Sup!
order by datum, und dann den ersten nehmen?
Gruesse,
Bio
yo,
order by datum, und dann den ersten nehmen?
Sortierungen mit ORDER BY und eventuelle Einschränken über LIMIT sind für solche Zwecke vollkommen ungeeignet.
Ilja
Hallo Markus,
ich habe eine Tabelle "Pruefungen". Dabei haben verschiedene Schüler diverse Fächer belegt und eine Note erhalten. Bei manchen Schülern gibt es aber 2 Noten oder mehr pro Fach. Ich will aber nur die neueste Note in diesem Fach ausgeben lassen (Zeugnis). Wie kann ich das anstellen?
Die Ausgabe:
AM 4 06.02.06
TDO 4 15.03.06
TDO 1 07.06.06
TDO 1 05.03.07
diese Standardaufgabe kannst Du mit einer korrelierten Unterabfrage lösen,
siehe z.B:
https://forum.selfhtml.org/?t=165112&m=1076544, 2. Schritt oder
dieses Archivposting.
Freundliche Grüße
Vinzenz
Hallo,
danke für den Tipp. Ich bekomme es aber heute wohl trotzdem nicht mehr ganz hin, da ich jetzt nur das aktuellste Datum pro Schüler bekomme:
SELECT P_G_Fach, P_Note, P_Datum FROM pruefungen
WHERE P_S_Kandidat = 111 AND P_Datum =
(SELECT MAX(P_datum) FROM pruefungen WHERE P_S_Kandidat = 111);
Irgendwie weiß ich nicht so recht, wie ich die Abfrage umformulieren muss.
Markus
Hallo Markus,
danke für den Tipp. Ich bekomme es aber heute wohl trotzdem nicht mehr ganz hin, da ich jetzt nur das aktuellste Datum pro Schüler bekomme:
SELECT P_G_Fach, P_Note, P_Datum FROM pruefungen
WHERE P_S_Kandidat = 111 AND P_Datum =
(SELECT MAX(P_datum) FROM pruefungen WHERE P_S_Kandidat = 111);
Du hast das missverstanden. Nein, in die Unterabfrage wird _keine_ id eingebaut.
Du benötigst die neueste Note
je Schüler
je Fach und
Also
SELECT -- Gib mir
p1.P_S_Kandidat, -- den Schüler
p1.P_G_Fach, -- das Fach
p1.P_Note, -- die Note
p1.Datum -- und das Datum, an dem der Schüler die Note
-- in diesem Fach erzielt hat
FROM pruefungen p1 -- aus der Tabelle pruefungen, die in der
-- äußeren Abfrage über den Aliasnamen p1
-- angesprochen wird
WHERE p1.Datum = ( -- wobei das Datum der Prüfung in einem Fach
SELECT -- gleich dem
MAX(p2.Datum) -- neuesten Prüfungsdatum
FROM
pruefungen p2 -- (aus der gleichen Tabelle, die wir zur
-- Unterscheidung über den Namen p2 ansprechen)
WHERE
p2.P_S_Kandidat = p1.P_S_Kandidat -- pro Kandidat
AND p2.P_G_Fach = p1.P_G_Fach -- und Fach ist
)
/* Hier kannst Du nun weiter einschränken */
WHERE p1.P_S_Kandidat = 111 -- nur die Noten des Schülers 111
Waren in den verlinkten Beispielen nur die neuesten Artikel je Autor bzw. der
letzte Umsatzeintrag je Kunde interessant, so sind es bei Dir die neuesten
Noten je Fach und Schüler.
Daraus resultiert die UND-Verknüpfung im Subselect - wie ich es über dem
SQL-Code bereits zusammengefaßt habe. Bei weiteren Klassifizierungen geht
man analog vor.
Wenn ich mal etwas Zeit finde, sollte ich das wirklich zu einem weiteren
Datenbankartikel ausbauen. Danke für das Beispiel :-)
Freundliche Grüße
Vinzenz
Hallo,
danke für deine ausführliche Antwort.
Übrigens befindet sich dein Artikel über die JOINs auch in meinen Bookmarks. Er hat mir nämlich auch schon geholfen,
Markus
Hallo nochmal,
auf einen kleinen Fehler bin ich draufgekommen, und zwar gehört anstatt des letzten WHERE ein AND. Dann funktioniert die Abfrage problemlos.
Markus