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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> apache derby: проблемы с использованием group by 
:(
    Опции темы
3,14
Дата 24.3.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Что то тем как то мало в данной ветке... Надеюсь что всё таки народ сюда заходит... smile

Есть две таблицы:
em_configs:
id: Integer
name: Varchar(100)
load: Varchar(100)

em_boxes:
id: Integer
ip_id: Integer
config_id: Integer
descr: Varchar(200)

Между ними есть связь один ко многим: em_configs.id=em_boxes.config_id
Нужно составить запрос, к-ый бы выбирал для каждой записи из em_configs ещё и минимальное значение ip_id из em_boxes.
выполняю следующий запрос:
Код

SELECT c.*, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY id

Вываливается ошбка:
Цитата

ERROR 42X03: Column name 'ID' is in more than one table in the FROM list.


Тот же запрос, с теми же таблицами для MySQL работает. Это уменя ошибка с запросом или база неверно работает?



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
skyboy
Дата 24.3.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Цитата(3 @ 14, 24.3.2008,  14:50 Найти цитируемый пост)
Тот же запрос, с теми же таблицами для MySQL работает. 

не может быть. должно выдавать ошибку. или у тебя структура таблиц в MySQL-варианте все же отличается.
Цитата(3 @ 14, 24.3.2008,  14:50 Найти цитируемый пост)
Column name 'ID' is in more than one table in the FROM list.

переводится так:
Цитата

Поле "ID" встречается в более, чем одной таблице из раздела FROM

Т.е. у тебя есть em_configs.id и em_boxes.id
ты говоришь:
Цитата(3 @ 14, 24.3.2008,  14:50 Найти цитируемый пост)
GROUP BY id

т.е. "группируй по полю с именем id". а по какому из двух - не говоришь.
укажи таблицу кроме имени поля и будет тебе счастье.
Цитата(3 @ 14, 24.3.2008,  14:50 Найти цитируемый пост)
Что то тем как то мало в данной ветке...

раздел только создан.
PM MAIL   Вверх
3,14
Дата 24.3.2008, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Цитата(skyboy @  24.3.2008,  17:20 Найти цитируемый пост)
т.е. "группируй по полю с именем id". а по какому из двух - не говоришь.
укажи таблицу кроме имени поля и будет тебе счастье.

Так?
Код

SELECT c.*, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY c.id


Цитата

The SELECT list of a grouped query contains at least one invalid expression. If a SELECT list has a GROUP BY, the list may only contain valid grouping expressions and valid aggregate expressions.  

ЗЫ: переводить сообщения не нужно, буржуйский у меня на уровне разговорного.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Kangaroo
Дата 24.3.2008, 18:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

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



Нельзя писать в селекте c.*, если ты группируешь.
Можна так:
Код

SELECT c.id, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY c.id



--------------------
Lost....
PM MAIL MSN   Вверх
3,14
Дата 25.3.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Запрос:
Код

SELECT c.id, c.name, c.load, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY c.id


Та же самая ошибка:
Цитата

The SELECT list of a grouped query contains at least one invalid expression. If a SELECT list has a GROUP BY, the list may only contain valid grouping expressions and valid aggregate expressions.  



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
3,14
Дата 25.3.2008, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Цитата(skyboy @  24.3.2008,  17:20 Найти цитируемый пост)
не может быть. должно выдавать ошибку. или у тебя структура таблиц в MySQL-варианте все же отличается.

Да вроде не отличается:
Код

CREATE TABLE  `em_configs` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(45) NOT NULL,
  `load` varchar(45) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

CREATE TABLE  `em_boxes` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `ip_id` int(10) unsigned NOT NULL,
  `config_id` int(10) unsigned NOT NULL,
  `descr` varchar(45) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


Проверил все три варианта с MySQL:
Код

SELECT c.*, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY id
SELECT c.*, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY c.id
SELECT c.id, c.name, c.load, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY c.id

все нормально работают...


Это сообщение отредактировал(а) 3,14 - 25.3.2008, 10:57


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
skyboy
Дата 25.3.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



чесно говоря, я в растерянности.
попробуй
Цитата(3 @ 14, 25.3.2008,  09:31 Найти цитируемый пост)
 SELECT c.id, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY c.id


PM MAIL   Вверх
3,14
Дата 25.3.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Попробовал вместо GROUP BY использовать вложенный подзапрос:
Код

SELECT c.*, (SELECT min(b.ip_id) FROM em_boxes b WHERE c.id=b.config_id) as min_ip_id FROM em_configs

Опять же, с MySQL всё прекрасно работает, а вот с apache derby валит ошибку:
Цитата

'C' is not an exposed table name in the scope in which it appears.

Похоже что придётся всё таки менять код под использование другой базы...  smile 


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
skyboy
Дата 25.3.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



подзапросы - этол ты зря.
то, что я приводил, попробовал?
PM MAIL   Вверх
3,14
Дата 25.3.2008, 22:26 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Цитата(skyboy @  25.3.2008,  16:41 Найти цитируемый пост)
подзапросы - этол ты зря. 

почему?
Цитата(skyboy @  25.3.2008,  16:41 Найти цитируемый пост)
то, что я приводил, попробовал? 

да:
Цитата

The SELECT list of a grouped query contains at least one invalid expression. If a SELECT list has a GROUP BY, the list may only contain valid grouping expressions and valid aggregate expressions.  




--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Fortop
Дата 25.3.2008, 23:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 2
Всего: 42



Не может этот запрос у тебя работать. По определению. Проверь еще раз!
Цитата(3 @ 14, 25.3.2008,  10:54 Найти цитируемый пост)
SELECT c.id, c.name, c.load, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY c.id


Поясняю. Все выражения внутри SELECT ..... FROM должны быть либо агрегатными функциями (min, max, sum, count) либо обязаны быть перечислены в GROUP BY.

Т.е. вот это должно работать, а то что ты приводил - работать не должно.
Только так.
Код

SELECT c.id, c.name, c.load, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY c.id, c.load, c.name


О том, почему оно работает в MySQL
читать тут
MySQL extends the use of GROUP BY to allow selecting fields that are not mentioned in the GROUP BY clause

Это сообщение отредактировал(а) Fortop - 25.3.2008, 23:44


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
3,14
Дата 26.3.2008, 14:56 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Цитата(Fortop @  25.3.2008,  23:44 Найти цитируемый пост)
Не может этот запрос у тебя работать. По определению. Проверь еще раз!
Цитата(3 @ 14, 25.3.2008,  10:54 Найти цитируемый пост)
SELECT c.id, c.name, c.load, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY c.id

Проверил ещё раз, не работает  smile Более того, попробовал вместо apache derby использовать HSQLDb (другая java БД), опять не работает с этим запросом :(
Цитата

Not in aggregate function or group by clause: org.hsqldb.Expression@10e3293 in statement [SELECT c.id, c.name, c.load, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY c.id]



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Fortop
Дата 26.3.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 2
Всего: 42



smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile 
Алло!
Найди три отличия между тем что тебе говорят

Цитата(Fortop @  25.3.2008,  23:44 Найти цитируемый пост)
SELECT c.id, c.name, c.load, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY c.id, c.load, c.name


и тем что ты делаешь!

Цитата(3 @ 14, 26.3.2008,  14:56 Найти цитируемый пост)
SELECT c.id, c.name, c.load, min(b.ip_id) as min_ip_id FROM em_configs c, em_boxes b WHERE c.id=b.config_id GROUP BY c.id


Добавлено через 1 минуту и 24 секунды
P.S. Еще раз не прочтешь, что тебе пишут... заминусую репутацию. Надоело.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
3,14
Дата 26.3.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Fortop, сорри за невнимательность. Твой вариант действительно работает.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Fortop
Дата 26.3.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 2
Всего: 42



Не вопрос.

Просто иногда стоит читать ошибки, которые тебе выдает система.
А о том почему твой запрос срабатывал в MySQL - выше есть ссылка.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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