Oracle GROUP BY给出错误ORA-00979:不是GROUP BY表达式

时间:2011-10-26 10:37:15

标签: sql oracle group-by

我们假设我们有两个表

table1
    ----------------------
    |ID         | Date   |
    ----------------------
    |1          |20110101|
    |1          |20110102|
    |1          |20110103|
    |2          |20110102|
    |2          |20110103|
    |2          |20110104|
    ----------------------

table2
    ----------------------
    |ID2        |val     |
    ----------------------
    |1          |152     |
    |2          |155     |
    ----------------------

使用此查询

SELECT * FROM table1, table2
WHERE table1.ID = table2.ID2
GROUP BY table1.ID 
ORDER BY DATE DESC

Mysql应该返回此

-------------------------------------------
|ID         |date    |ID2        |val     |
-------------------------------------------
|1          |20110103|1          |152     |
|2          |20110104|2          |155     |
-------------------------------------------

在Oracle中我收到此错误: ORA-00979: not a GROUP BY expression

编辑: 列MAX上的Date函数不起作用,因为此列为varchar(200) 数据库/表格结构不是我的,我不能改变它。

5 个答案:

答案 0 :(得分:2)

你需要做两件事之一......

  • GROUP BY并使用汇总功能将多个记录合并为一个
  • 使用一些查找来识别您希望从该组中获得的一条记录


在您的情况下,您不仅需要来自table1的MAX(),因为可能可能更高的id具有更低的date。在那种情况下,我倾向于使用查找系统...

WITH
  ordered_table1 AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY date_field DESC) AS sequence_number,
    *
  FROM
    table1
)
SELECT
  *
FROM
  ordered_table1
INNER JOIN
  table2
    ON table2.id = ordered_table1.id
WHERE
  ordered_table1.sequence_id = 1

注意:这假设您的日期格式化,以便字母数字排序将产生正确的日期顺序。如果不是这种情况(d-m-yyyy 正确订购),则需要将date_field替换为TO_DATE(date_field)以确保正确的顺序。

注意:使用TO_DATE(date_field)也可能会解决您的MAX()问题。

注意:如果您希望将日期存储为字符串,但要将其设置为订单友好,请使用yyyy-mm-dd

答案 1 :(得分:1)

以下列方式尝试:

   SELECT *
     FROM table1
LEFT JOIN table2 
       ON table1.ID = table2.ID
 ORDER BY DATE DESC
 GROUP BY table1.ID

答案 2 :(得分:1)

在带有group by的SQL语句的select和order by子句中,您只能使用group by中使用的列/表达式或其他列的聚合函数(min,max,avg ..)。

我知道这对于oracle而且我有点惊讶,这在MySQL中是不同的

答案 3 :(得分:0)

在oracle中分组意味着您正在尝试在其中一列上运行聚合函数(求和,计数等)。您似乎只想先按ID排序,然后再按日期排序。我会做这样的事情:

SELECT * 
FROM   table1
       JOIN table2 ON (table1.ID = table2.ID2)
ORDER BY ID,
         DATE DESC

如果那不是您想要的,那么答案是您需要select子句中不属于聚合函数的每一列都在group子句中。

修改

回应评论:

最好先将表1作为子查询过滤掉,然后加入table2:

SELECT *
FROM   (SELECT DISTINCT ID,MAX(TO_DATE(DATE,'mm-dd-yyyy')) FROM Table1 GROUP BY ID) T1
       JOIN Table2 ON (T1.ID = Table2.ID2)
ORDER BY date DESC

答案 4 :(得分:0)

一般来说,将select * fromgroup by结合使用是一个坏主意。 select子句中的表达式必须是标量,即组的聚合函数,或与分组无关,或者在group by子句本身。 Select *几乎可以保证不会出现这种情况。你可能想要这样的东西:

select t1.id, max(t1.date), t2.id, max(t2.val)
  from table1 t1
  join table2 t2 on t1.id=t2.id
  group by t1.id
  order by  max(t1.date) desc