以下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
答案 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小马之前所说的。