Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> oracle ORA-00979: выражение не является выражением 
:(
    Опции темы
4epT
Дата 29.12.2011, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Добрый вечер всем! Имееется вот такой запрос:

Код

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


Что я не так делаю ?
PM MAIL   Вверх
password
Дата 29.12.2011, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 23.9.2008
Где: Украина, Сумы

Репутация: 4
Всего: 8



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


Это сообщение отредактировал(а) password - 29.12.2011, 18:15
PM MAIL Skype   Вверх
4epT
Дата 29.12.2011, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Дело в том что 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, какой будет результат ?
PM MAIL   Вверх
password
Дата 29.12.2011, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 23.9.2008
Где: Украина, Сумы

Репутация: 4
Всего: 8



Цитата

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

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

Это сообщение отредактировал(а) password - 29.12.2011, 18:32
PM MAIL Skype   Вверх
4epT
Дата 29.12.2011, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Понятно, спасибо большое за объяснение ) я просто не правильно понимал как работает group by.

А не подскажите, group by  так работает во всех СУБД ? или только в Oracle ?
PM MAIL   Вверх
password
Дата 29.12.2011, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 23.9.2008
Где: Украина, Сумы

Репутация: 4
Всего: 8



Цитата

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

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

Это сообщение отредактировал(а) password - 29.12.2011, 18:57
PM MAIL Skype   Вверх
Zloxa
Дата 30.12.2011, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(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.

Это сообщение отредактировал(а) Zloxa - 30.12.2011, 02:15


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.