2010-08-17 121 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值,你要麼需要通過集團的所有其它列,或可考慮分析功能(很多以前的答案對堆棧溢出)。