SQL - 带或不带子查询的计数?

时间:2016-09-17 07:27:25

标签: sql postgresql subquery common-table-expression

我的数据库中有两个表:

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

我的解决方案是否正确?我没有看到使用子查询的理由,但现在我担心我错了。

谢谢,

艾伦

2 个答案:

答案 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)