我的数据库中有两个表:
Building(bno,address,bname) - PK is bno. bno
Room(bno,rno,floor,maxstud) - PK is bno,rno (together)
建筑物表格代表建筑物编号,地址和名称。 房间表代表楼房号码,房间号码,楼层号码以及可以住在房间内的学生人数。
我必须写的查询:
找一个至少有10个房间的建筑物,其中可容纳的最多学生数量为1.列数应为bno,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
我的解决方案是否正确?我没有看到使用子查询的理由,但现在我担心我错了。
谢谢,
艾伦
答案 0 :(得分:1)
你的解决方案更好。
如果您不确定,请对样本数据集运行两个查询,并说服自己结果是相同的。
答案 1 :(得分:1)
您的查询执行速度会更快但我不敢编译,因为您没有在GROUP BY子句中包含每个未聚合的列(此处:pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
currentPage = position + 1;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
//inflater.inflate(R.menu.menu_item, menu);
getMenuInflater().inflate(R.menu.menu_fragment, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Take appropriate action for each action item click
switch (item.getItemId()) {
case R.id.fragmentPos:
this.setTitle(currentPage);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
)。
此外,您拥有的不属于您的解决方案会计算不同的房间号码,因此可以得出结论,建筑物可以有多个房间具有相同的数字,例如在不同楼层,以便通过以下方式正确识别房间:独特的三联building.bname
。
鉴于我上面写的内容,您的查询将会显示:
(bno, rno, floor)