当前位置: 代码迷 >> Sql Server >> 请问一个练习题中有关问题
  详细解决方案

请问一个练习题中有关问题

热度:47   发布时间:2016-04-24 09:20:52.0
请教一个练习题中问题。
--33、查询成绩比该课程平均成绩低的同学的成绩表
select a.DEGREE from SCORE a
join SCORE b
on a.SNO=b.SNO
where a.DEGREE<(select AVG(b.DEGREE) from SCORE)
我的解法是上面这个,运行后显示:
消息 147,级别 15,状态 1,第 4 行
聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。
然后答案是下面这个:
SELECT A.* FROM SCORE A WHERE DEGREE<(SELECT AVG(DEGREE) FROM SCORE B WHERE A.CNO=B.CNO)
运行出来是OK的。

有谁能告诉我这2句到底差别在哪里?
而且有时候我where后面跟聚合函数也是可以用,有时候就会报错 谁能讲一下 谢谢了

------解决思路----------------------
你看下语句不觉得好奇怪吗? select AVG(b.DEGREE) from SCORE 这里是对  SCORE  所有的数据进行一个平均的聚合。并且聚合是一个b.degree 的值,在逻辑上你觉得行得通么?

你的有时候不报错,有可能是没有引用连接表的任意一张表,独立的子查询才不会报错啊
------解决思路----------------------
你的写法,既不符合你要的业务逻辑,也不符合语法要求

不知道这么说你能明白不,放于等式的子查询,结果必须只能有一个
select a.DEGREE from SCORE a
join (select AVG(DEGREE)DEGREE,CNO from SCORE GROUP BY CNO) b
on a.CNO=b.CNO
where a.DEGREE<b.DEGREE
按照你的样式,也可以写成这样
  相关解决方案