查询适用于MySQL而不是Oracle

时间:2010-08-17 19:53:59

标签: sql mysql database oracle ora-00923

以下SQL语句适用于MySQL,但不适用于Oracle:

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

Oracle投诉:“找不到FROM关键字”


实际上声明不正确,我们没有按COLUMN_A分组,而是另一列。实际上我们想要的是这个

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

5 个答案:

答案 0 :(得分:3)

这是因为Oracle要求您定义未包含在聚合函数中的所有列(MIN,MAX,COUNT等)。 SQL Server将返回类似的错误。 MySQL's behavior is documented here

由于您的查询使用SELECT *,我无法为您正确地重新编写。但我也无法保证语法正确的版本会返回与您在MySQL上看到的相同的结果。按照你希望MAX的相同列分组很奇怪......

答案 1 :(得分:1)

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

SELECT MAX(COLUMN_A) 
  FROM table_xyz 
 WHERE COLUMN_A <= 100 

答案 2 :(得分: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子句中包含的列以外的列这一事实。正如其他人所说,甲骨文不会这样做。

答案 3 :(得分:1)

这不能回答你的MAX问题,但是对于其他列使用'*'的唯一方法是使用对表别名的显式引用 - 例如。

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

对于MAX值,您需要按所有其他列分组,或者查看分析函数(Stack Overflow上的大量先前答案)。

答案 4 :(得分:0)

多个问题。您的GROUP BY子句是向后的。您需要通过*中的列定义GROUP BY。也是OMG小马之前所说的。