Oracle GROUP BY дает ошибку ORA-00979: не выражение GROUP BY - PullRequest
1 голос
/ 26 октября 2011

давайте предположим, что у нас есть две таблицы

table1
    ----------------------
    |ID         | Date   |
    ----------------------
    |1          |20110101|
    |1          |20110102|
    |1          |20110103|
    |2          |20110102|
    |2          |20110103|
    |2          |20110104|
    ----------------------

table2
    ----------------------
    |ID2        |val     |
    ----------------------
    |1          |152     |
    |2          |155     |
    ----------------------

Используя этот запрос

SELECT * FROM table1, table2
WHERE table1.ID = table2.ID2
GROUP BY table1.ID 
ORDER BY DATE DESC

Mysql должен вернуть это

-------------------------------------------
|ID         |date    |ID2        |val     |
-------------------------------------------
|1          |20110103|1          |152     |
|2          |20110104|2          |155     |
-------------------------------------------

В Oracle я получаю эту ошибку:ORA-00979: not a GROUP BY expression

РЕДАКТИРОВАТЬ: функция MAX для столбца Date не работает, поскольку этот столбец varchar(200) Структура базы данных / таблиц не моя, и я не могу ее изменить.

Ответы [ 5 ]

2 голосов
/ 26 октября 2011

Вам нужно сделать одну из двух вещей ...

  • GROUP BY и использовать агрегатные функции для консолидации нескольких записей до одной
  • Использовать некоторый поиск для идентификации одной записивы хотите из группы


В вашем случае вам не нужен просто MAX () из таблицы1, так как может бытьВозможно, что более высокий id имеет более низкий date.В этом случае я был бы склонен использовать поисковую систему ...

WITH
  ordered_table1 AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY date_field DESC) AS sequence_number,
    *
  FROM
    table1
)
SELECT
  *
FROM
  ordered_table1
INNER JOIN
  table2
    ON table2.id = ordered_table1.id
WHERE
  ordered_table1.sequence_id = 1

ПРИМЕЧАНИЕ: Это предполагает, что ваша дата отформатирована так, что буквенно-цифровой порядок приведет к правильному порядку даты,Если это НЕ тот случай (и d-m-yyyy будет не правильно заказывать), вам нужно заменить date_field на TO_DATE(date_field), чтобы обеспечить правильный порядок.

ПРИМЕЧАНИЕ: Использование TO_DATE(date_field) также, вероятно, решит ваши проблемы MAX ().

ПРИМЕЧАНИЕ: Если вы хотите сохранить даты в виде строк, но ихчтобы сделать заказ дружественным, используйте yyyy-mm-dd

1 голос
/ 26 октября 2011

В предложении выбора и упорядочения по выражению SQL с оператором по группе можно использовать только столбцы / выражения, используемые в группе, или агрегатные функции (min, max, avg ..) других столбцов.

Я знаю это для оракула, и я немного удивлен, что это отличается в MySQL

1 голос
/ 26 октября 2011

Попробуйте следующим образом:

   SELECT *
     FROM table1
LEFT JOIN table2 
       ON table1.ID = table2.ID
 ORDER BY DATE DESC
 GROUP BY table1.ID
0 голосов
/ 26 октября 2011

В общем, говорить select * from в сочетании с group by - плохая идея.Выражения в предложении выбора должны быть скалярными, то есть либо агрегировать функции группы, либо не связаны с группировкой, либо в группе самим предложениемSelect * в значительной степени гарантирует, что это не так.Вы, вероятно, хотите что-то вроде этого:

select t1.id, max(t1.date), t2.id, max(t2.val)
  from table1 t1
  join table2 t2 on t1.id=t2.id
  group by t1.id
  order by  max(t1.date) desc
0 голосов
/ 26 октября 2011

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

SELECT * 
FROM   table1
       JOIN table2 ON (table1.ID = table2.ID2)
ORDER BY ID,
         DATE DESC

Если это не то, что вы намереваетесь, то ответ заключается в том, что вам нужно, чтобы каждый столбец в предложении select, который не является частью агрегатной функции, содержался в предложении group.

EDIT

В ответ на комментарий:

Вероятно, лучше сначала отфильтровать таблицу 1 как подзапрос, а затем присоединиться к таблице 2:

SELECT *
FROM   (SELECT DISTINCT ID,MAX(TO_DATE(DATE,'mm-dd-yyyy')) FROM Table1 GROUP BY ID) T1
       JOIN Table2 ON (T1.ID = Table2.ID2)
ORDER BY date DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...