Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Derby, order by в подзапросах


Автор: Maksym 27.5.2008, 18:42
Derby не позволяет ограничить количество выбираемых SELECT'ом записей с помощью LIMIT и OFFSET, как это делают другие базы (мотивируется это тем, что этих ключевых слов нет в стандарте).
Взамен предлагается делать так:
Код

SELECT * FROM  
( SELECT ROW_NUMBER() OVER() AS rownum, my_id, my_name 
FROM my_table)  
AS tmp WHERE rownum > 10 AND rownum <= 15

и это работает, возвращается 5 записей из моего подзапроса. Хорошо..
Но вот я захотел отсортировать подзапрос по полю my_name:
Код

SELECT * FROM  
( SELECT ROW_NUMBER() OVER() AS rownum, my_id, my_name 
FROM my_table
ORDER BY my_name ASC)  
AS tmp WHERE rownum > 10 AND rownum <= 15

На это Derby возвращает ошибку.. мол неожиданный ORDER встретился..
В документации на это пишут:
Цитата

Derby does not currently support ORDER BY in subqueries, so there is currently no way to guarantee the order of rows in the SELECT subquery. An optimizer override can be used to force the optimizer to use an index ordered on the desired column(s) if ordering is a firm requirement.


Здорово..   smile  Неужели такая в общем-то разивтая и не молодая СУБД не умеет делать такую элементарную вещь! Невозможно сделать постраничный просмотр отсортированной таблицы..!  smile 

Может я что-то пропустил.. недопонял..? есть идеи..?

ЗЫ. Попытки что-нибудь подкрутить с optimizer'ом, о котром они пишут в цитате выше, ничего не дали. Да и бред это -- лезть в  optimizer, чтобы сделать элементарнейший SELECT!

Нужна помощь...  smile 

Автор: LSD 27.5.2008, 18:50
Вообще-то секция order by, должна идти после where.

Автор: Maksym 27.5.2008, 18:53
LSD
В смысле? Я хочу выбрать все данные из таблицы, без условий.

Автор: LSD 27.5.2008, 19:05
Это я ошибся, неправильно прочитал твой запрос.

А вьюхи в дерби есть?

Автор: Maksym 27.5.2008, 21:31
LSD
Есть. Попытка создать View сдедующим запросом:
Код

CREATE VIEW new_view (my_id, my_name) as 
SELECT my_id, my_name 
FROM my_table
ORDER BY my_name ASC

Выдает ту же ошибку что и раньше:
Код

Encountered "order" at line 4, column 1.


Бред какой-то. Этой базой наверняка же пользовались в реальных проектах...   smile 

Может я что-то в http://db.apache.org/derby/docs/dev/ref/rrefsqlj13658.html тупо лажаю.. ? Но не похоже..

Автор: Maksym 27.5.2008, 23:57
У людей http://www.nabble.com/Problem-with-derby-10.4-td16685190.html, и они тоже не могут найти вменяемого решения....

Добавлено @ 23:58
Derby неприятно поразил меня...
Ищу уже не нормальное  решение, а хотя бы вменяемый воркэраунд..

Автор: Maksym 28.5.2008, 12:11
Просьба к модераторам:

Перенесите, пожалуйста, тему в раздел "Java: Общие вопросы". Насколько я знаю, это раздел посещает больше людей хорошо знакомых с Derby (как никак pure java database).

Добавлено через 8 минут и 40 секунд
LSD, спасибо..

Автор: Maksym 28.5.2008, 15:10
http://www.onjava.com/pub/a/onjava/2007/01/31/tuning-derby.html?page=1, с описанием всех подводных камней. Кривовато как по мне. Еще один аргумент использовать ORM и абстрагироваться от заморочек создателей СУБД.

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