Ziel ist es, den jüngsten Schüler in einer bestimmten Klasse anzuzeigen. Ich habe den einen mit den GROUP BY- und HAVING-Klauseln erstellt, aber die vorgeschlagene Antwort verwendet sie nicht. Während es sinnvoll ist, wie ihre Antwort funktioniert, verstehe ich immer noch nicht, warum meine Antwort nicht funktioniert. Sollte es nicht dasselbe sein?Was ist der Unterschied zwischen den beiden SQL-Abfragen?
Mine druckt mehrere Zeilen von wahrscheinlich allen Schülern in der Tabelle ENROLLMENT. Es sollte dies nur tun, wenn ich wegen der GROUP BY die HAVING-Klausel weggelassen hätte. Aber warum macht es das immer noch, selbst wenn die HAVING-Klausel es dem Eliminieren von Gruppen, die die Bedingung nicht erfüllen, sagt?
select
studfname
|| ' '
|| studlname as fullname,
studdob
from
uni.student s,
uni.enrolment e
where
s.studid = e.studid
and
e.unitcode = 'FIT1004'
and
studdob =
(
select
min(studdob)
from
uni.student s,
uni.enrolment e
where
s.studid = e.studid
and
e.unitcode = 'FIT1004'
)
order by
s.studid;
SELECT studfname|| ' ' ||studlname AS stud_name, studdob
FROM uni.student s, uni.enrolment e
WHERE e.studid = s.studid
AND unitcode = 'FIT1004'
GROUP BY studfname, studlname, studdob
HAVING studdob = min(studdob);
Vielen Dank im Voraus!
Ah ja. Ich sehe es jetzt. Ich dachte, die having-Klausel könnte Gruppen miteinander vergleichen. Gibt es keine andere Möglichkeit, Gruppen miteinander zu vergleichen? Anders als Unterabfragen. –
Wenn Sie Gruppen miteinander vergleichen möchten, würde ich vorschlagen, eine temporäre Tabelle oder einen gemeinsamen Tabellenausdruck zu verwenden, um zuerst Ihre Gruppen einzurichten, und dann mit einer zweiten Abfrage danach abzufragen, um Ihren Vergleich/Filterung durchzuführen. IMO, temporäre Tabellen oder CTEs sind normalerweise leichter zu lesen, zu codieren und zu bearbeiten als korrelierte Unterabfragen. – Shoeless