我正在使用以下查询获取ORA-00979:

SELECT cr.review_sk, cr.cs_sk, cr.full_name,
tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt",
cs.cs_id, cr.tracking_number
from review cr, cs, fact cf
where cr.cs_sk = cs.cs_sk
and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%'
and row_delete_date_time is null
and cr.review_sk = cf.review_wk (+)
and cr.fact_type_code (+) = 183050
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number
ORDER BY cs.cs_id, cr.full_name;


我找不到在同一查询中同时具有GROUP BY和ORDER BY子句的任何示例。我尝试一次从组中删除每个字段,但是仍然遇到相同的错误。

#1 楼

您必须将SELECT的所有列都放在GROUP BY中,或在其上使用将结果压缩为单个值的函数(例如MINMAXSUM)。

一个简单的示例可以理解为什么会发生这种情况:假设您有一个这样的数据库:

FOO BAR
0   A
0   B


,然后运行SELECT * FROM table GROUP BY foo。这意味着数据库必须返回一行第一行0作为结果来满足GROUP BY的要求,但是现在有bar的两个值可供选择。您会期望哪个结果-AB?还是数据库应该返回多个行,从而违反GROUP BY的合同?

评论


不,您不需要将它们放在order by子句中

– Xaisoft
09年10月5日在15:10

我尝试将ORDER BY中的两列添加到GROUP BY。那行得通。谢谢!

–特蕾莎
09年10月5日在15:12

或换一种说法:如果您有两列,并按第一列分组,则意味着每个结果行的第二列中都有多个值。由于只有一个结果行,但有很多值可供选择,因此数据库应返回哪个值?第一次偶然发现?

–亚伦·迪古拉(Aaron Digulla)
09年10月8日在8:23

@AaronDigulla这就是MySQL所做的,世界并没有结束:p

–克里斯·贝克(Chris Baker)
2014年8月27日在21:32

我部分同意。但是假设以下情况:有4列:A,B,C和D。现在,我将(A,B,C)设置为组合键。然后,“选择A,B,max(C),D ...由A,B分组”就不存在歧义,因为对于A,B和C的每种组合,都已经定义了D。甲骨文仍然拒绝履行职责。

– g.a
17 Mar 6 '17 at 17:17



#2 楼

GROUP BY子句中包括不是组函数参数的所有SELECT表达式。

#3 楼

太糟糕了,Oracle具有这样的局限性。当然,不在GROUP BY中的列的结果将是随机的,但有时您希望这样做。愚蠢的Oracle,您可以在MySQL / MSSQL中执行此操作。

但是可以解决Oracle:

,但以下行不起作用

SELECT unique_id_col, COUNT(1) AS cnt FROM yourTable GROUP BY col_A;


您可以使用以下一些0来欺骗Oracle,以使您的列处于范围内,但不能按其分组(假设这些是数字,否则使用CONCAT)。

SELECT MAX(unique_id_col) AS unique_id_col, COUNT(1) AS cnt 
FROM yourTable GROUP BY col_A, (unique_id_col*0 + col_A);


评论


上面没有严格定义@GlennFromIowa的伪表,而且我不再为11g的公司工作,我无法提供更好的示例,尽管上次测试时这是一个问题。

–约瑟夫·欲望
2015年11月21日,0:14

出于好奇,什么时候需要随机结果的例子是什么?我想不出任何理由要按FOO分组并获得BAR的随机行。

–凯尔·布莱恩汀(Kyle Bridenstine)
17-10-17在17:48

#4 楼

如果通过包含GROUP BY子句进行分组,则SELECT中不是组函数(或聚合函数或聚合列)的任何表达式,例如COUNTAVGMINMAXSUM等(聚合函数列表)
示例(正确的方式)(此处GROUP BY不是组函数(非聚合列),因此它必须出现在employee_id中。相反,sum(salary)是组函数(聚合列) ),因此不需要出现在GROUP BY子句中。
   SELECT employee_id, sum(salary) 
   FROM employees
   GROUP BY employee_id; 

示例(错误的方式)(此处GROUP BY不是组函数,并且它没有出现在employee_id子句中,这将导致ORA -00979错误。
   SELECT employee_id, sum(salary) 
   FROM employees;

要纠正,您需要执行以下操作之一:


GROUP BY子句中包含SELECT子句中列出的所有非聚合表达式
GROUP BY子句中删除组(聚合)功能。


#5 楼

您应该执行以下操作:

SELECT cr.review_sk, 
       cr.cs_sk, 
       cr.full_name,
       tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt",
       cs.cs_id, 
       cr.tracking_number
from review cr, cs, fact cf
where cr.cs_sk = cs.cs_sk
       and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%'
       and row_delete_date_time is null
       and cr.review_sk = cf.review_wk (+)
       and cr.fact_type_code (+) = 183050
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number, cs.cs_id, cr.full_name
ORDER BY cs.cs_id, cr.full_name;


#6 楼

当在选择表达式和按表达式分组的两个位置中未同时使用UPPER或LOWER关键字时,也会出现相同的错误。

错误:-

select a , count(*) from my_table group by UPPER(a) .


右:-

select UPPER(a) , count(*) from my_table group by UPPER(a) .


#7 楼

分组依据用于聚合某些数据,具体取决于聚合函数,而不是您需要将需要分组的一个或多个列放入的数据。

例如:

select d.deptno, max(e.sal) 
from emp e, dept d
where e.deptno = d.deptno
group by d.deptno;


这将导致部门的最高工资。

现在,如果我们从group by子句中省略d.deptno,则会出现相同的错误。

#8 楼

除其他答案外,如果order by子句不一致,也可能导致此错误。例如:

select 
    substr(year_month, 1, 4)
    ,count(*) as tot
from
    schema.tbl
group by
    substr(year_month, 1, 4)
order by
    year_month