2

次の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
4

5 に答える 5

3

これは、Oracle では、集計関数 (MIN、MAX、COUNT など) でラップされていないすべての列を定義する必要があるためです。SQL Server は同様のエラーを返します。 MySQL の動作は、ここに文書化されています

あなたのクエリは を使用してSELECT *いるため、適切に書き直すことができません。しかし、構文的に正しいバージョンが MySQL で見られるのと同じ結果を返すことも保証できません。MAXが必要な同じ列でグループ化するのはかなり奇妙です...

于 2010-08-17T20:06:52.907 に答える
1

column_a の max() が必要な場合は、group by はまったく必要ありません。

SELECT MAX(COLUMN_A)
  FROM table_xyz
 WHERE COLUMN_A <= 100
于 2010-08-17T20:12:01.527 に答える
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オラクルは、句に含まれている列以外の列を取得しようとしているという事実さえ見ていません。他の人が述べているように、オラクルはそうしません。

于 2010-08-17T20:17:42.627 に答える
1

これはMAXの問題には答えませんが、「*」の後に他の列を付ける唯一の方法は、テーブルエイリアスへの明示的な参照を使用する場合です-たとえば

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

MAX値については、他のすべての列でグループ化するか、分析関数を調べる必要があります(スタックオーバーフローに関する以前の回答がたくさんあります)。

于 2010-08-17T21:35:11.387 に答える
0

複数の問題。GROUP BY 句が逆になっています。* の列で GROUP BY を定義する必要があります。また、OMGポニーが以前に言ったこと。

于 2010-08-17T20:12:05.760 に答える