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
或者在它们上使用将结果压缩为单个值(如MIN
, MAX
或SUM
)的函数。
一个简单的例子来理解为什么发生这种情况:想象一下你有一个这样的数据库:
FOO BAR 0 A 0 B
并运行SELECT * FROM table GROUP BY foo
。 这意味着数据库必须返回一行作为第一列0
来完成GROUP BY
但是现在有两个值可供select。 你会期望哪个结果 – A
还是B
? 还是应该数据库返回多行,违反了GROUP BY
的合同?
在GROUP BY
子句中包含所有不是组函数参数的SELECT
expression式。
太糟糕了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式分组的情况下, UPPER或LOWER关键字在两处都不使用时也会出现同样的错误。
错: –
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式(非聚合函数(或集合函数或聚合列),如COUNT
, AVG
, MIN
, MAX
, SUM
等等)应该存在于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
子句中删除组(聚合)函数。