问题描述:
A,B两张表。A 中有id,planNumber字段.B表中有:id,aid,inputNumber.
即A中是下达的计划数量。B中有A的id,以及已经录入的数量。
现在操作人员登录系统,要查询上级领导下达计划(即A表信息)。
我想这样实现:
显示的条件是:planNumber>sum(inputNumber)的就说明还有任务没有完成,那么任务(A表信息)就显示出来。
我的解决方案是:
先查询出A中所有可用的记录List<A>,然后遍历list<A> 得到A对象a, 然后a.getId()
然后查询B :select sum(inputNumber) from B where aid=a.getId().
再来和A中 planNumber比较 如果二者不等。那么把这个A对象a放到另一个List1中。页面最后遍历这个List1.
这样可以实现,但是似乎和恐怖,因为没一个A对象就查询一次数据库。是不是传说的N+1问题了。
请问有什么好的方法,比如一个sql搞定或者别的好的方法。
A,B两张表。A 中有id,planNumber字段.B表中有:id,aid,inputNumber.
即A中是下达的计划数量。B中有A的id,以及已经录入的数量。
现在操作人员登录系统,要查询上级领导下达计划(即A表信息)。
我想这样实现:
显示的条件是:planNumber>sum(inputNumber)的就说明还有任务没有完成,那么任务(A表信息)就显示出来。
我的解决方案是:
先查询出A中所有可用的记录List<A>,然后遍历list<A> 得到A对象a, 然后a.getId()
然后查询B :select sum(inputNumber) from B where aid=a.getId().
再来和A中 planNumber比较 如果二者不等。那么把这个A对象a放到另一个List1中。页面最后遍历这个List1.
这样可以实现,但是似乎和恐怖,因为没一个A对象就查询一次数据库。是不是传说的N+1问题了。
请问有什么好的方法,比如一个sql搞定或者别的好的方法。
from A a
where a.planNumber > (select sum(b.inputNumber) from B b
where b.aid = a.id);
还是说如果不存在这样的B,就不应该选出来?
from A a
where a.planNumber > ifnull((select sum(b.inputNumber) from B b
where b.aid = a.id),0); mysql中加个null的函数判断吧,oracle中用nvl这个
from A a
where a.planNumber > (select sum(b.inputNumber) from B b
where b.aid = a.id);
这样可以啊!
与其用1楼的子查询,不如用这个join好了。