--试试下面的写法,这样写效率也比较高一点select outer.firstname,outer.age,outer.t_id from persons outer join (select t_id,avg(age) avgage from persons where group by t_id) avgtab on outer.t_id = avgtab.t_id where outer.age < avgtab.avgage
select firstname,age,t_id from persons outer where age < (select avg(age) from persons ); 这是楼主要的结果吗? 你是不是T_ID是主键啊,如果是,那你那么写就肯定为空的.
re:你是不是T_ID是主键啊,如果是,那你那么写就肯定为空的. 那是什么原因?
re:你是不是T_ID是主键啊,如果是,那你那么写就肯定为空的. 那是什么原因? ==========> 因为,当ID是当主键时,所有记录都符合下面条件 select firstname,age,t_id from persons outer where age =(select avg(age) from persons where t_id=outer.t_id) 也就是说,没有任何一条记录是小于的。
select firstname,age,t_id from persons outer where age < (select avg(age) from persons);这样才是对的.因为你用t_id本来就是一个人.怎么会有平均呢??平均就是应该全部或部分.
我猜:楼主的表里t_id是个类似组的编号,每组有N个人(firstname,age),现要查出每个t_id组的年龄小于平均年龄的人名、年龄、组名。 你那么写好象没有错,我没试验过。可能是每个t_id组只有一条记录吧。 你的写法效率很低,如果有N条记录,会查询2的N次方次表 要我就这么写,只查询2的N倍次表: select outer.firstname,outer.age,outer.t_id from persons outer, (select avg(age) age,t_id from persons group by t_id) outer2 where outer.t_id=outer2.t_id and outer.age<outer2.age;
--试试下面的写法,这样写效率也比较高一点select outer.firstname,outer.age,outer.t_id
from persons outer
join (select t_id,avg(age) avgage
from persons
where group by t_id) avgtab
on outer.t_id = avgtab.t_id
where outer.age < avgtab.avgage
from persons outer
where age <
(select avg(age)
from persons
);
这是楼主要的结果吗?
你是不是T_ID是主键啊,如果是,那你那么写就肯定为空的.
那是什么原因?
那是什么原因?
==========> 因为,当ID是当主键时,所有记录都符合下面条件
select firstname,age,t_id
from persons outer
where age =(select avg(age)
from persons
where t_id=outer.t_id)
也就是说,没有任何一条记录是小于的。
from persons outer
where age <
(select avg(age)
from persons);这样才是对的.因为你用t_id本来就是一个人.怎么会有平均呢??平均就是应该全部或部分.
你那么写好象没有错,我没试验过。可能是每个t_id组只有一条记录吧。
你的写法效率很低,如果有N条记录,会查询2的N次方次表
要我就这么写,只查询2的N倍次表:
select outer.firstname,outer.age,outer.t_id
from persons outer,
(select avg(age) age,t_id from persons group by t_id) outer2
where outer.t_id=outer2.t_id
and outer.age<outer2.age;