ORA-00979不是一组expression式

我得到以下查询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子句的任何示例。 我尝试一次从组中删除每个字段,但仍然得到相同的错误。

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

一个简单的例子来理解为什么发生这种情况:想象一下你有一个这样的数据库:

 FOO BAR 0 A 0 B 

并运行SELECT * FROM table GROUP BY foo 。 这意味着数据库必须返回一行作为第一列0来完成GROUP BY但是现在有两个值可供select。 你会期望哪个结果 – A还是B ? 还是应该数据库返回多行,违反了GROUP BY的合同?

GROUP BY子句中包含所有不是组函数参数的SELECTexpression式。

太糟糕了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); 

group by用于聚合一些数据,具体取决于聚合函数,除此之外,您需要将需要分组的列放入列中。

例如:

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

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

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

您应该执行以下操作:

 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; 

在selectexpression式和按expression式分组的情况下, UPPERLOWER关键字在两处都不使用时也会出现同样的错误。

错: –

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

对 :-

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

如果您通过包含GROUP BY子句进行摸索,那么SELECT任何expression式(非聚合函数(或集合函数或聚合列),如COUNTAVGMINMAXSUM等等)应该存在于GROUP BY子句中。

示例(正确的方法) (这里employee_id不是组函数(非聚合列),所以它必须出现在GROUP BY相反,sum(salary)是一个组函数(聚合列),所以不需要出现在GROUP BY子句中。

  SELECT employee_id, sum(salary) FROM employees GROUP BY employee_id; 

示例(错误的方式) (这里employee_id不是组函数,它不会出现在GROUP BY子句中,这会导致ORA-00979错误。

  SELECT employee_id, sum(salary) FROM employees; 

要更正您需要执行以下任一操作:

  • GROUP BY子句中包含SELECT子句中列出的所有非聚合expression式
  • SELECT子句中删除组(聚合)函数。
Interesting Posts