2

The following SQL statement works in MySQL but not with Oracle:

SELECT *, MAX(COLUMN_A) 
  FROM table_xyz 
 WHERE COLUMN_A <= 100 
GROUP BY COLUMN_A

Oracle complaint: "FROM keyword not found where expected"


actually the statement was incorrect, we were not grouping by COLUMN_A but another column instead. actually what we want is this

SELECT *, MAX(COLUMN_A) 
  FROM table_xyz 
 WHERE COLUMN_A <= 100 
GROUP BY COLUMN_B

this works but gives us only column A and B

SELECT COLUMN_B, MAX(COLUMN_A) 
  FROM table_xyz 
 WHERE COLUMN_A <= 100 
GROUP BY COLUMN_B

what we want is this, but it doesn't work (group by error)

SELECT COLUMN_B, COLUMN_C .... COLUMN_X, MAX(COLUMN_A) 
  FROM table_xyz 
 WHERE COLUMN_A <= 100 
GROUP BY COLUMN_B
4

5 回答 5

3

这是因为 Oracle 要求您定义所有未包含在聚合函数中的列(MIN、MAX、COUNT 等)。SQL Server 将返回类似的错误。 MySQL 的行为在此处记录

因为您的查询正在使用SELECT *,所以我无法为您正确地重新编写它。但我也不能保证语法正确的版本会返回与您在 MySQL 上看到的相同的结果。按你想要 MAX 的同一列分组是很奇怪的......

于 2010-08-17T20:06:52.907 回答
1

除了其他人所说的之外,Oracle 不允许*在查询中与显式列定义混合:

SQL> select *, table_name from user_tables;
select *, table_name from user_tables
        *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected

Oracle 甚至没有考虑过您正在尝试获取group by子句中包含的列之外的列。正如其他人所说,甲骨文不会这样做。

于 2010-08-17T20:17:42.627 回答
1

如果您想要 column_a 的 max(),则根本不需要 group by:

选择最大值(COLUMN_A)
  FROM table_xyz
 其中 COLUMN_A <= 100
于 2010-08-17T20:12:01.527 回答
1

这并不能回答您的 MAX 问题,但是在其他列之后使用 '*' 的唯一方法是,如果您使用对表别名的显式引用 - 例如

 SELECT e.*, zip_code
 FROM  addresses a,
       employees e
 WHERE e.addressId = a.Id

对于 MAX 值,您要么需要按所有其他列分组,要么查看分析函数(Stack Overflow 上有很多以前的答案)。

于 2010-08-17T21:35:11.387 回答
0

多个问题。您的 GROUP BY 子句是倒退的。您需要通过 * 中的列定义您的 GROUP BY。还有 OMG Ponies 之前说的。

于 2010-08-17T20:12:05.760 回答