2016-05-01 3 views
2

ich für einen SQL-Test studierte und im Vorjahr hat die letzte Frage:die Min() ein Grafen Rückflug()

Namen die Schüler, die die geringste Anzahl von Papieren studiert hat. Wie viele Papiere haben sie studiert?

Bisher ist dies die SELECT-Abfrage, die ich erstellt haben:

select min(Full_Name), min(Amount) 
from (select st.ST_F_Name & ' ' & st.ST_L_Name as Full_Name, count(*) as Amount 
from (student_course as sc 
inner join students as st 
on st.ST_ID=sc.SC_ST_ID) 
group by st.ST_F_Name & ' ' & st.ST_L_Name) 

Das funktioniert perfekt für die Rückgabe des Ergebnisses ich will, aber ich bin mir nicht sicher, ob dies ist die Art, wie ich soll mache diese Abfrage? Ich habe das Gefühl, min() auf dem Full_Name zu nennen, könnte unter bestimmten Umständen auf mich zurückfallen. Gibt es einen besseren Weg, dies zu tun? (Dies ist in MS Access aus unbekannten Gründen)

+0

Es tut, weil es nur einen einzigen Schüler in diesem Fall zurückgeben gibt. Aber was, wenn ich mehrere Studenten mit der geringsten Anzahl von Papieren hätte? Von dem, was ich weiß, würde dies nur einen einzigen Schüler und nicht die anderen zurückgeben. Wie könnte ich es so schreiben, dass es alle zurückgibt, wenn es mehrere gibt? – Syzorr

+0

Es gibt zwei Möglichkeiten: 1. Verwenden Sie, wo kein Schüler mit einer höheren Anzahl von gelesenen Papieren existiert, 2. finden Sie das Minimum und verbinden Sie die Tabelle mit den Zählungen erneut, um die Schülernamen zu erhalten, die diese zählen. Ohne 'mit' sind beide Abfragen ziemlich nervig zu schreiben. – maraca

+0

Übrigens gibt es eine Inkonsistenz in der Frage selbst: "Student" und "hat" ist Singular, aber "haben" und "sie" ist Plural. (Wir möchten 'mit' verwenden, da beide Methoden zweimal auf die Zwischentabelle mit den Zählwerten verweisen, dann müssen wir sie nicht zweimal schreiben.) – maraca

Antwort

1

wenn Sie nur 1 dieser Schüler wollen, wenn es mehrere sind, ist dies wahrscheinlich die einfachste:

select st.ST_F_Name, st.ST_L_Name, count(*) as Amount 
from student_course as sc 
inner join students as st 
on st.ST_ID=sc.SC_ST_ID 
group by st.ST_ID 
order by Amount ASC LIMIT 1 

Wenn Sie jedoch alle Stuch Studenten finden wollen, folgen Sie einen anderen Ansatz. Wir verwenden eine WITH-Klausel, um Dinge zu vereinfachen, die einen CTE (Common Table Expression) definiert, der die Anzahl der Kurse pro Schüler berechnet. Und dann wählen wir die Schüler, wo ihre Zahl in diesem CTE auf das Minimum entspricht:

with per_student as (
select st.ST_F_Name, st.ST_L_Name, count(*) as Amount 
from student_course as sc 
inner join students as st 
on st.ST_ID=sc.SC_ST_ID 
group by st.ST_ID 
) 
select * from per_student 
where amount = (select min(amount) from per_student) 

Aber der eigentliche Trick in dieser Frage ist, dass es möglicherweise Studenten sein, die keine Kurse haben. Aber mit den bisher vorgestellten Ansätzen werden Sie sie nie sehen. Sie möchten etwas wie dieses:

with per_student as (
select st.ST_F_Name, st.ST_L_Name, count(sc.SC_ST_ID) as Amount 
from student_course as sc 
right outer join students as st 
on st.ST_ID=sc.SC_ST_ID 
group by st.ST_ID 
) 
select * from per_student 
where amount = (select min(amount) from per_student) 
+0

Ich musste dies etwas ändern, damit es mit MS Access funktioniert, aber danke dafür. Die With-Klausel scheint in Access nicht identisch zu sein. – Syzorr

+1

@Syzorr das ist richtig, der Grund, warum ich die Kommentare nicht als Antwort ... mit den Abfragen gemacht habe. – maraca

0

Sie können count(*) bestellen die Schüler mit der geringsten Anzahl der Papiere zu bekommen:

dh

select * from students where st_id in (
    select top 1 sc_st_id 
    from student_course 
    group by sc_st_id 
    order by count(*) 
) 

wenn Sie auch die Anzahl der Papiere müssen eine abgeleitete Tabelle mit dem min Zählung untersucht, dann kommen:

select * from students s 
left join (
    select top 1 sc_st_id, count(*) 
    from student_course 
    group by sc_st_id 
    order by count(*) 
) t on t.sc_st_id = s.st_id 
+1

Dieser Code würde immer noch 1 Schüler geben, wenn es mehrere mit den wenigsten gab Papiere. – Syzorr