Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > oracle ORA-00979: выражение не является выражением


Автор: 4epT 29.12.2011, 17:52
Добрый вечер всем! Имееется вот такой запрос:

Код

select r.ID, REPORT_STATUS.STATUS_DESCR, r.TYPE_ID, REPORT_TYPE.TYPE_DESCR,
           r.ROUTE, r.THEME, r.DATE_IN, RECIPIENTS.DATE_SEND, USERS.LOGIN
    from (((REPORT r inner join REPORT_TYPE on r.TYPE_ID = REPORT_TYPE.ID) inner join 
          REPORT_STATUS on r.STATUS_ID = REPORT_STATUS.ID) inner join
          RECIPIENTS on r.ID = RECIPIENTS.REPORT_ID) inner join
          USERS on USERS.ID = RECIPIENTS.USER_ID
    where r.ROUTE = '[email protected]'
    GROUP BY r.ID
    ORDER BY DATE_SEND DESC


Данный запрос выберает все отправленные отчеты по отправителю ([email protected]), один отчет может уйти на нескольких адресатов, тем самым я пытаюсь сделать Group by по id отчета, что бы каждый отправленные отчет стал уникальным. При выполнении этого запроса вываливается такая ошибка:
Код

 ORA-00979: выражение не является выражением GROUP BY


Что я не так делаю ?

Автор: password 29.12.2011, 18:12
1. что то непонятное накрутили после from
2. При группировке обязательно нужно указывать все поля
3. 
Цитата
один отчет может уйти на нескольких адресатов, тем самым я пытаюсь сделать Group by по id отчета, что бы каждый отправленные отчет стал уникальным
 условием r.ROUTE = '[email protected]' - вы уже выбрали только те кто уходит на '[email protected]'

ну и sql должен приобрести приблизительно такой вид:
Код

select r.ID, REPORT_STATUS.STATUS_DESCR, r.TYPE_ID, REPORT_TYPE.TYPE_DESCR,
           r.ROUTE, r.THEME, r.DATE_IN, RECIPIENTS.DATE_SEND, USERS.LOGIN
    from REPORT r
inner join REPORT_TYPE on r.TYPE_ID = REPORT_TYPE.ID
inner join REPORT_STATUS on r.STATUS_ID = REPORT_STATUS.ID
inner join RECIPIENTS on r.ID = RECIPIENTS.REPORT_ID
inner join USERS on USERS.ID = RECIPIENTS.USER_ID
    where upper(r.ROUTE) = upper('[email protected]')
    ORDER BY r.DATE_SEND DESC

Автор: 4epT 29.12.2011, 18:21
Дело в том что r.ROUTE это выбирает все отправленные ... [email protected] это тот кто отправил отчет.

Если будет такая ситуация:

Код

ID             ROUTE                DESCRIPTION
1               [email protected]     descr1
1               [email protected]     descr3
2               [email protected]     descr4
2               [email protected]     descr5
3               [email protected]     descr6
3               [email protected]     descr7


если тут группировать по ID, какой будет результат ?

Автор: password 29.12.2011, 18:31
Цитата

если тут группировать по ID, какой будет результат ?

только по одному полю ID группировать нельзя, если вы группируете, то группировку нужно проходит ПО ВСЕМ ВЫВОДИМЫМ полям, кроме расчетных (SUM,COUNT,MAX....)
почитайте про "Аналитические функции "в ORACLE 

Автор: 4epT 29.12.2011, 18:50
Понятно, спасибо большое за объяснение ) я просто не правильно понимал как работает group by.

А не подскажите, group by  так работает во всех СУБД ? или только в Oracle ?

Автор: password 29.12.2011, 18:57
Цитата

group by  так работает во всех СУБД ? или только в Oracle ?

Исключения я встречал только MySQL и в DBASE при работе через FOXPRO - там можно группировать по нескольким полям.

Автор: Zloxa 30.12.2011, 02:04
Цитата(password @  29.12.2011,  18:57 Найти цитируемый пост)
там можно группировать по нескольким полям.

 smile 
Здесь тоже можно группировать по нескольким полям.
Наверное ты не правильно выразился.  smile 

На счет FoxPro не знаю, но MySQL действительно допускает использовать в списке выводимых полей (select-list) не перечисленные в выражении group by поля без использования аггрегатов. Что, с моей точки зрения, слишком часто сбивает с толку новичков, мешает им понять суть происходящего и провоцирует их допускать ошибки. 

Цитата(4epT @  29.12.2011,  17:52 Найти цитируемый пост)
я пытаюсь сделать Group by по id отчета, что бы каждый отправленные отчет стал уникальным

Для того, чтобы правильно реализовать это условие, надо определиться по какому принципу дожны формироватся дополнительные аттрибуты выборки.
Например в вашем случае:
Цитата(4epT @  29.12.2011,  18:21 Найти цитируемый пост)
ID             ROUTE                DESCRIPTION
1               [email protected]     descr1
1               [email protected]     descr3

какой дескрипшн из двух указанных, должен оказаться результирующей выборке, если значение ID станет там уникальным?

На этом примере прекрасно видно благо, которое несет наличие ограничения, наложенного ораклом. Начинающий MySQLщик не стал бы париться этим вопросом и получил бы недетерменированный результат, который сегодня, на тестовой среде, казалось бы, стабильно возвращает descr1, а завтра, при переносе окружение заказчика, необъяснимо, станет возвращать descr2.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)