关于group by的问题

不净之心 2009-11-25 02:27:01
一个必须注意的地方是:SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是聚合函数列。
-----------------------------------
select a.NEW_RO_SO_CASE,
'' as testcol,
count(*)
from vedvr_master a,ve_issue_letter b,ve_letter_dvr c where a.dvr_id = c.dvr_id and c.letter_id = b.letter_id
group by a.NEW_RO_SO_CASE,b.LETTER_TYPE_CODE

运行没问题 而

select PARENT_DVR_ID,
(select ENG_DESC from VE_DEFECT_GROUP where DEFECT_GROUP_CODE = a.DEFECT_GROUP_CODE1) as DEFECT_GROUP_DESC,
count(*)
from vedvr_master a group by PARENT_DVR_ID,DEFECT_GROUP_DESC
------------------ 却有问题呢?
我的疑问是:
第一句:b.LETTER_TYPE_CODE没有出现在select的列表中,却能运行。同时,testcol可有可无 一样能运行
第二句:DEFECT_GROUP_DESC出现在select列表中 为什么又运行不了?
我想是不是一定是出现在from的tables的列表中才对啊?
...全文
202 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
不净之心 2010-10-29
  • 打赏
  • 举报
回复
只要来了 都给分 谢谢大家...
ojuju10 2009-11-27
  • 打赏
  • 举报
回复
第一句:b.LETTER_TYPE_CODE没有出现在select的列表中,却能运行。同时,testcol可有可无 一样能运行
--b.LETTER_TYPE_CODE没有出现在select的列表中,也是可在Group by 中,这样分组更细,testCol是常量不是字段,所以没有关系

第二句:DEFECT_GROUP_DESC出现在select列表中 为什么又运行不了?
--DEFECT_GROUP_DESC是一个子查询,再嵌套一层就可以运行
Phoenix_99 2009-11-27
  • 打赏
  • 举报
回复
group by 后面不能使用本查询语句中新赋的字段别名
caozhifindjob 2009-11-27
  • 打赏
  • 举报
回复
支持一个吧
notebook800 2009-11-26
  • 打赏
  • 举报
回复
逗死我了
BenChiM888 2009-11-26
  • 打赏
  • 举报
回复
1、group by后面之所以必须跟上select后面的字段
1)group by顾名思义分组,把很多条数据分成一组,也就是说返回的结果是"一条"
2)如果select a,b,count(*) from table_name group by a;
假设出现如下数据
1 2
1 3
a 返回值是分组后的1,b呢? 是返回2 还是返回3,数据库"傻了",因此必须
select a,b,count(*) from table_name group by a,b;
3)即使在2)的举例中 b中的数据是完全相同的。
如:
1 2
1 2
select a,b,count(*) from table_name group by a;
也是不可以的,因为虽然对于你,b是相同的这件事是"显而易见的",但是对于数据库它是"不知道的",
必须显示的告诉他。
4)对于常量情况就不同了,相当于你显示的告诉了数据库,b字段的值是一样的,因此常量不在
group by 后面出现也是可以的。

2、sql的解析顺序是
from → where → group by → having → select → order by
因为 select 在 group by 后面被解析,因此在 select 中起的别名在 group by里面不会被识别。

※以上观点属于个人理解,如有不对的地方还请高手指正。
duqiangcise 2009-11-26
  • 打赏
  • 举报
回复
mark!明天看!
liusong_china 2009-11-25
  • 打赏
  • 举报
回复
第一句:b.LETTER_TYPE_CODE没有出现在select的列表中,却能运行。同时,testcol可有可无 一样能运行
-------
只要求select的列要出现在group by子句中,没说group by的列一定要出现在select中。
testcol是‘’,是一个常量,不是表中的列,无需聚合。


第二句:DEFECT_GROUP_DESC出现在select列表中 为什么又运行不了?
--------
group by后面不能使用前面的字段别名,你的DEFECT_GROUP_DESC是别名。
小灰狼W 2009-11-25
  • 打赏
  • 举报
回复
b.LETTER_TYPE_CODE不一定要出现在结果中
''是一个常量所以不需要聚合
小灰狼W 2009-11-25
  • 打赏
  • 举报
回复
group by后面不能使用本查询语句中新赋的字段别名

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧