2016-09-17 3 views
1

Ich habe zwei Tabellen in meiner DB:SQL - zählen mit oder ohne Unterabfrage?

Building(bno,address,bname) - PK is bno. bno 
Room(bno,rno,floor,maxstud) - PK is bno,rno (together) 

Das Gebäude Tabelle Gebäudenummer, Adresse und Name steht für. Der Room-Tisch steht für die Gebäudenummer, die Raumnummer, die Etagennummer und die maximale Anzahl an Studenten, die im Raum wohnen können.

Die Abfrage, die ich schreiben:

ein Gebäude finden, die mindestens 10 Zimmer, die die maximale Menge an Studenten, die in ist leben können 1. Die Säulen sollten bno, bname, die Anzahl der seine solche Räume.

Was ich schrieb:

select building.bno, building.bname, count(rno) 
from room natural join building 
where maxstud =1 
group by bno, bname 
having count(rno)>=10 

Was die Lösung, die ich Zustände haben:

with temp as (
select bno, count(distinct rno) as sumrooms 
from room 
where maxstud=1 
group by bno 
) 
select bno, bname, sumrooms 
from building natural join temp 
where sumrooms>=10 

Ist mein Lösung richtig? Ich habe keinen Grund gesehen, eine Unterabfrage zu verwenden, aber jetzt habe ich Angst, dass ich falsch lag.

Danke,

Alan

+1

ich argumentieren würde, dass Ihre Lösung wird nicht kompiliert, da Sie durch Klausel jede unaggregierter Spalte in der Gruppe nicht enthalten. –

+0

@KamilG. Du hast Recht, danke! – Alan

Antwort

1

Ihre Abfrage wird schneller ausgeführt, aber ich fürchte, wird nicht kompilieren, weil Sie nicht alle nicht aggregierten Spalte in der GROUP BY-Klausel (hier: building.bname).

Auch die Lösung, die Sie haben, die nicht Ihr ist, zählt unterschiedliche Raumnummern, so kann man zu dem Schluss kommen, dass ein Gebäude mehrere Räume mit den gleichen Nummern beispielsweise auf verschiedenen Etagen haben kann, damit ein Raum richtig identifiziert wird durch das einzigartige Triple (bno, rno, floor).

Anbetracht dessen, was ich über Ihre Frage geschrieben haben würde aussehen:

select building.bno, building.bname, count(distinct rno) 
from room natural join building 
where maxstud = 1 
group by 1,2 -- I used positions here, you can use names if you wish 
having count(distinct rno) >= 10 
1

Ihre Lösung ist besser.

Wenn Sie sich nicht sicher sind, führen Sie beide Abfragen in einem Beispieldatensatz aus und überzeugen Sie sich davon, dass die Ergebnisse identisch sind.

+0

Vielen Dank für Ihre Antwort! – Alan