2010-08-17 76 views
2

下面的SQL语句工作在MySQL,但没有与Oracle:查询工作在MySQL不是Oracle

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

甲骨文诉: “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 
+1

正确。您必须调整查询。 – 2010-08-17 20:00:33

+1

你能描述一下你实际想要达到的目标吗?这个声明根本没有意义 – 2010-08-17 21:09:02

回答

3

这是因为甲骨文需要你定义不是包裹在一个聚合函数(MIN,MAX,COUNT等)的所有列。 SQL Server将返回一个类似的错误。 MySQL's behavior is documented here

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

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

实际上除了MySQL以外的所有DBMS都会拒绝运行这样的查询。 MySQL只是返回不确定的结果 – 2010-08-17 20:11:14

+0

实际上该语句不正确,我们不是按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 Dave 2010-08-17 20:16:21

+0

@a_horse_with_no_name:不,SQLite支持MySQL支持的相同“隐藏列”功能。但是,任何*真实*数据库,是的 - 你是对的。 :) – 2010-08-17 20:17:17

1

分组。你的GROUP BY子句是倒退的。您需要通过*中的列来定义您的GROUP BY。此外OMG Ponies以前说过。

0

多个问题:如果你想为column_a最大()你不通过都需要通过组你想要的MAX是很奇怪的同一列...

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 

甲骨文甚至还没有看的事实,你试图让外界列那些包含在group by条款中的那些。正如其他人所说,Oracle不会这样做。

1

这并不能解决您的MAX问题,但如果您使用对表别名的明确引用(例如,

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

对于MAX值,你要么需要通过集团的所有其它列,或可考虑分析功能(很多以前的答案对堆栈溢出)。