2016-09-17 6 views
1

は、私は自分のDB内の2つのテーブルを持っている:SQL - サブクエリの有無にかかわらずカウント?

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

ビルテーブルは建物番号、住所と名前を表します。 部屋のテーブルは、建物の番号、部屋番号、階数、部屋に居れる生徒の最大人数を表します。私が書く必要が

クエリ:

が住んでいることができ、学生の最大量は1列はBNOあるべきである、少なくとも10件の客室を提供してい建物、BNAME、数を探しますそのような部屋。

私が書いたもの:

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

私は何を持っている状態ソリューション:

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 

が私の解決策は正しいですか?私はサブクエリを使う理由は見当たりませんでしたが、今は間違っていました。

おかげで、

アラン

+1

私はあなたが句によってグループ内のすべての非凝集の列が含まれていないので、あなたのソリューションがコンパイルされませんと主張していると思います。 @KamilG。 –

+0

。あなたは正しいです、ありがとう! – Alan

答えて

1

クエリが高速に実行されますが、GROUP BY句(ここではbuilding.bname)に集約されていないすべての列が含まれていないため、コンパイルできません。

また、自分のものではない解決策では別個の部屋番号がカウントされるため、建物が異なる階に同じ番号の部屋を複数持つことができるため、部屋が正しく識別されます。独特のトリプルで(bno, rno, floor)。私はあなたのクエリの上に書いてきたものを考える

はなります

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

あなたのソリューションが優れています。

確信が持てない場合は、サンプルデータセットで両方のクエリを実行し、結果が同じであることを確認します。

+0

お返事ありがとうございます! – Alan

関連する問題