Order By

Совместимость InterBase, Firebird, Yaffil между собой и по версиям

Модераторы: kdv, Alexey Kovyazin

_so_
Сообщения: 144
Зарегистрирован: 04 ноя 2004, 22:17

Order By

Сообщение _so_ » 05 апр 2005, 15:37

На FB Firebird-1.5.2.4731_embed_win32 не выполняется множество запросов, которые выполнялняются на всех версиях IB.
Орет:
Invalid expression in the ORDER BY clause (not contained in either an aggregate function or the GROUP BY clause)
Пример SQL запроса:
select Count(ID), SeniorID from Classes Group By SeniorID Order By Name

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 05 апр 2005, 15:44

Нельзя указывать в ордер бай те поля которых нет в груп бай
select Count(ID), SeniorID from Classes Group By SeniorID Order By Name
Напиши, например так:
select Count(ID), SeniorID from Classes Group By SeniorID Order By 2

Я так все такие запросы перелопатил когда портировал свои программы с ИБ60 на ФБ 152.

_so_
Сообщения: 144
Зарегистрирован: 04 ноя 2004, 22:17

Сообщение _so_ » 05 апр 2005, 15:57

Код: Выделить всё

select Count(ID), SeniorID from Classes Group By SeniorID Order By 2 
Это уже другой запрос.
Плохо что совместимости уже нет на уровне выполнения запросов а не различных фич появившихся в IB или FB.
Писать прогу совместимую с обоими серверами слишком сложно. А согласиться на прокачку данных не нужных полей для IB не хочется.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 05 апр 2005, 16:08

_so_ писал(а): Плохо что совместимости уже нет на уровне выполнения запросов а не различных фич появившихся в IB или FB.
Дык баги - они на тои баги, чтобы их правили.

Код: Выделить всё


SeniorID       Name
1                   AAAA
1                   BBBB
1                   CCCC
И какой ожидаешь результат своего запроса? Он некорректен и то, что раньше пропускали - бага.

_so_
Сообщения: 144
Зарегистрирован: 04 ноя 2004, 22:17

Сообщение _so_ » 05 апр 2005, 16:28

Это не бага в IB это прекрасно работает. Начиная с IB 5.5

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 05 апр 2005, 17:01

бага. Вот тебе еще один результат запроса:

Код: Выделить всё

1     Иванов В.И.
2     Петров И.П.
5     Шумилина В.Л.
3     Афанасьев Р.С.
теперь ответь мне, по какому столбцу сделан order by.

то есть
select id, fio
from persons
order by ....

кроме того, см. пример кривого запроса в
http://www.ibase.ru/ibo/n7.htm

от 27.08.2001.

_so_
Сообщения: 144
Зарегистрирован: 04 ноя 2004, 22:17

Сообщение _so_ » 05 апр 2005, 17:19

Этот пример вообще не корректен, где здесь group By. Можно определить только по другим даным.
Да я понял в что вы имеете ввиду.
Для начального запроса если есть записи с одинаковым SeniorID и разными Name, то непонятно как сортировать. Я бы таких глупых запросов и не написал.
Может мой пример не удачный.
В изначльном запросе в Group By попадало поле уникальный ключ и соотвествено поля сортировки не могли быть разные для данной групировки и это прекрасно работало. Тащить лишние даные тоже не хочется. Я понимаю что эта защита, но хотелось бы опционально если сделал, то сам дурак.

_so_
Сообщения: 144
Зарегистрирован: 04 ноя 2004, 22:17

Сообщение _so_ » 05 апр 2005, 17:31

Вот более правильный пример:

Код: Выделить всё

select Count(ID), C1.SeniorID from Classes C1
join Classes C2 on C2.ID=C1.SeniorID
 Group By C1.SeniorID
Order By C2.Name

Где ID первичный ключ.
Особено не хочется тащить name в котором сидят строки и мне ненужна эта информация, а важен порядок.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 05 апр 2005, 17:35

Да ёксель-моксель, это ты знаешь, что на этих конкретных данных так можно. А серверу откуда? Сначала все записи пребрать и удостовериться, что к ним такой синтаксис применим, а к соседнему запросу - нет, фигня получится? Группировка-сортировка - это универсальные алгоритмы, которые либо должны гарантированно работать на любых данных, либо отказываться работать вообще.

_so_
Сообщения: 144
Зарегистрирован: 04 ноя 2004, 22:17

Сообщение _so_ » 05 апр 2005, 17:37

А вот здесь действительно я ошибся насчет
Особено не хочется тащить name в котором сидят строки и мне ненужна эта информация, а важен порядок.
Тогда такой вопрос на сколько замедлиться выполние запроса если я добавлю C2.Name в секцию Group By

_so_
Сообщения: 144
Зарегистрирован: 04 ноя 2004, 22:17

Сообщение _so_ » 05 апр 2005, 17:39

2Merlin IB работает же.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 05 апр 2005, 18:48

_so_ писал(а):А вот здесь действительно я ошибся насчет
Особено не хочется тащить name в котором сидят строки и мне ненужна эта информация, а важен порядок.
Тогда такой вопрос на сколько замедлиться выполние запроса если я добавлю C2.Name в секцию Group By
Проверь на своих данных. Зависит от длины Name. И заодно ответь на вопрос (себе) - зачем в этом конкретном случае сортировка по неизвлекаемому полю. Я знаю случаи, когда она нужна в запросах обычного вида, но не могу припомнить именно для таких, как правило внутренних, не показываемых пользователю, запросов с агрегатами.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 05 апр 2005, 18:49

_so_ писал(а):2Merlin IB работает же.
Работает. И FB1 работает. Но на некоторых запросах возвращает тихонько ахинею. Потому и пресечено.

_so_
Сообщения: 144
Зарегистрирован: 04 ноя 2004, 22:17

Сообщение _so_ » 05 апр 2005, 19:14

И заодно ответь на вопрос (себе) - зачем в этом конкретном случае сортировка по неизвлекаемому полю.
Нужна и еще как нужна.

Замедлится - это очень плохо.
Пресекать можно было бы более правильно. В моем примере 2 по структуре данных можно было бы определить что охинеи не будет (Есть первичный ключ)
Отключение возможности,а не более грамотная проработка - это не решении проблемы.
Ок спасибо за информацию.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 05 апр 2005, 19:17

Этот пример вообще не корректен, где здесь group By. Можно определить только по другим даным.
секундочку. а нафига мне group by? мсье, давайте вести толковище оперируя понятиями вроде "множество". На диске есть исходное множество (со столбцами x, y, z). Мы его группируем, получаем другое множество (со столбцами a, b, c, замечу). Теперь к этому множеству (другому) применяем правило "отсортировать элементы множества по" по.... по какому столбцу, позвольте спросить? по столбцу z? с какого рожна? :)

кстати, ответ в моей загадке прост. запрос выводит результат с order by birthdate. То есть, мы тупо смотрим в результат, и нифига не понимаем, что хотел сказать разработчик программы, и почему записи отсортированы именно в таком порядке. "мы" - это пользователь программы, который исходного запроса не видит, и sql не знает.

Группировка, тем более, это порождение множества "виртуальных" записей, так или иначе агрегированных. если мы получаем в результате группировки столбцы a, b и c, то как мы вообще можем отсортировать это множество, если в нем нет столбца z?

Я вот, как и Merlin, могу припомнить случай сортировки по неизвлекаемому например такой:

Код: Выделить всё

select id, fio
from table
order by fio_upper
тут еще хоть какой-то смысл есть.

Извини меня, но я все равно в общем случае буду считать сортировку по невыбираемому столбцу натуральной ахинеей. просто потому, что из конечного набора записей невозможно понять, почему он выведен именно в таком порядке, а не в другом.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 05 апр 2005, 19:27

kdv писал(а): Извини меня, но я все равно в общем случае буду считать сортировку по невыбираемому столбцу натуральной ахинеей. просто потому, что из конечного набора записей невозможно понять, почему он выведен именно в таком порядке, а не в другом.
Малость горячишься. Есть такой класс систем - внутрикопоративные, т.е. для посвящённых в некое тотемическое знание. У меня например, список ценовых групп выводится в сортировке 'Класс товара, Наименование группы'. Какой товар к какому классу относится они и во сне ответят, название не нужно им, а вот видеть в известной степени взаимозаменяемое рядушком - удобно. Но вот агрегат, сгруппированный по одному полю, а отсортированный по другому... На ранних этапах обучения каждый из моих орлов нагородил малость такого в ХП, чиста по инерции от клиентских запросов, при помощи copy/paste например. Потом спрашиваешь - а на хрена? - Нуу... так как-то привычнее... :wink:

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 05 апр 2005, 20:16

Малость горячишься.
да мы с тобой друг-другу одно и то же уже года два говорим :) Про твой пример я в курсе, видишь, и свой пример привел :)

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 05 апр 2005, 21:26

Резюмирую. То, как сделано в IB - слишком неправильно. То, как сделано в FB - слишком правильно. Истина, как всегда, где-то посередине. Мы выбрали то, что четко предписано стандартом. Здравый смысл подсказывает, что в случае группировки по PK можно допускать сортировку по полю той же таблицы. Но проверять это в сервере - гемор. Возможно, когда-нибудь Арно начнет пить пиво и я его на это склоню :wink: Ну а пока живите с тем, что есть.

Насчет "отняли фичу" - в сад. В FB2 мы еще больше чего поотнимали. И будем продолжать в том же духе, на благо наших неразумных юзверей. Аминь.

_so_
Сообщения: 144
Зарегистрирован: 04 ноя 2004, 22:17

Сообщение _so_ » 05 апр 2005, 21:55

Понятно, что лень делать. Я обычно сам так отвечаю зависимым от меня программистам. Сегодня демо версию нужно было отдавать. А для простоты использую FB embed. Тестер как всегда нашел в последнеий день ошибку, что часть отчетов отвалилась.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 05 апр 2005, 21:59

А ты не знал? Да FB делают вообще самые отъявленные лентяи на свете. Мы с тобой после работы вот пиво пьём и ящик смотрим, а они всё ленятся, ленятся безудержно :lol:

Ответить