Запрос работает в MySQL, а не в Oracle - PullRequest
2 голосов
/ 17 августа 2010

Следующий оператор 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 ]

3 голосов
/ 18 августа 2010

Это связано с тем, что Oracle требует от вас определить все столбцы, не обернутые в статистическую функцию (MIN, MAX, COUNT и т. Д.). SQL Server вернет аналогичную ошибку. Поведение MySQL задокументировано здесь .

Поскольку ваш запрос использует SELECT *, я не могу переписать его правильно для вас. Но я также не могу гарантировать, что синтаксически правильная версия выдаст те же результаты, что и в MySQL. Группировка по тому же столбцу, который вы хотите, МАКС довольно странный ...

1 голос
/ 18 августа 2010

Это не отвечает вашей проблеме MAX, но единственный способ следовать '*' с другими столбцами - это если вы используете явную ссылку на псевдоним таблицы - например,

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

Для MAXзначение, вам нужно либо сгруппировать по всем другим столбцам, либо изучить аналитические функции (множество предыдущих ответов по переполнению стека).

1 голос
/ 18 августа 2010

В дополнение к тому, что говорят все остальные, 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. Что, как говорили другие, Oracle не сделает.

1 голос
/ 18 августа 2010

Если вы хотите максимальное значение () для column_a, вам вообще не нужна группа:

SELECT MAX(COLUMN_A) 
  FROM table_xyz 
 WHERE COLUMN_A <= 100 
0 голосов
/ 18 августа 2010

Несколько проблем.Ваше предложение GROUP BY задом наперед.Вам нужно определить свой GROUP BY по столбцам в *.Кроме того, что OMG Ponies сказал раньше.

...