-
День добрый. например такая табличка MyTable(ID, CAPTION, MYPARAM) есть два запроса, дающих одинаковый результат
select CAPTION, sum(MYPARAM)
from MYTABLE
group by ID, CAPTION и
select max(CAPTION), sum(MYPARAM)
from MYTABLE
group by ID есть ли какие нить соображения, _общие для всех распростронённых субд_, какой их этих запросов выбрать
-
> есть ли какие нить соображения, _общие для всех распростронённых > субд_, какой их этих запросов выбрать
Смотря что надо получить
Запросы разные, результаты в общем случае тоже будут разные.
-
Соображение простое - писать просто и ясно то, что надо получить. Данные примеры не тождественны, и то, что результат одинаков - лишь частный случай. Для ответа необходимо исчерпывающе знать, что есть ID и CAPTION. В вопросе это умалчивается.
-
общие соображения - если для твоих целей запросы равнозначны (дают одинаковый результат) выбирай тот который работает быстрее (под тем sql сервером который предполагается чаще использовать).
-
> есть два запроса, дающих одинаковый результат
Это означает, что у тебя уникальный ИД, иначе результаты не могут быть одинаковыми.
-
> иначе результаты не могут быть одинаковыми. еще если каждый ID строго соответствует CAPTION-у, пусть и повторяются (одно "аватар" другого). типа ID CAPTION MYPARAM 2 'два' 1 2 'два' 2 3 'три' 3 3 'три' 4 3 'три' 3
-
> sniknik (14.04.2008 00:21:05) [5]
Ну иак не честно :-)
-
А если серьезно, тогда только первый запрос
-
Хотя нужен ответ какой результат должен быть в данном случае
3 'три' 3 3 'три' 4 3 'два' 3
7 или 10 По первому варианту будет
> 3 'три' 7 > 3 'два' 3
по второму
> 3 'три' 7
-
это два принципиально разных запроса. Второй лучше для СУБД, потому что требует в разы меньше памяти под сортировку > для всех распростронённых субд_, если ты уверен, что результат обоих запросов эквивалентен для юзеров - то 2-й. Но внимательно прочитай http://ag-orlov.narod.ru/itnotes.htm#001Главу "Вы согласились" раздел "В. Научитесь" пример про магазины
-
> если ты уверен, что результат обоих запросов эквивалентен > для юзеров - то 2-й.
да, уверен. ID - это PK. Сенкс.
-
> jack128_ (14.04.08 09:52) [10]
А CAPTION может повторяться для разных ID? Если нет, то GROUP BY CAPTION. Если да, то получается, что разные сущности с одинаковым именем???
-
> jack128_ (14.04.2008 09:52:10) [10]
Раз существует группировка по ИД, то смысла в ней нет, поскольку нет одинаковых ИД
-
> Раз существует группировка по ИД, то смысла в ней нет, поскольку > нет одинаковых ИД
ну да. тут я ошибся. Не коректный пример -( ORGS (ID, CAPTION) - ID - PK SALES (ID, ORGID, PRICE, ...) select o.CAPTION, sum(s.PRICE)
from SALES
join ORGS o on o.ID = s.ORGID
group by o.ID, o.CAPTION > Если да, то получается, что разные сущности с одинаковым > именем???
да, у нас такое бывает.
-
> да, у нас такое бывает.
Как же их юзер различает?
-
> > Если да, то получается, что разные сущности с одинаковым > > именем??? > > да, у нас такое бывает. >
Не давать ввести пользователю имя существующей сущности. Иначе граблей огрести можно - мама не горюй.
-
как вводят - так и различает. хз, на самом деле. реально, там еще туча полей выводится, как то по совокупности, наверное. еще есть иерархич. структура, по токой эти организации забиты, может по положению в этой структуре..
-
> jack128_ (14.04.2008 10:26:13) [13]
Это уде другое дель, здесь есть смысл. O.Caption это название клиента или организации? или что то другое? Вообще то у меня предчувстие о неправильной организации БД, хотя бы их за имен. Но и все равно, в группировке o.ID лишний поскольку o.CAPTION обязан быть уникален, иначе смотри Johnmen © (14.04.2008 10:50) [14]
-
> jack128_ (13.04.08 22:29)
понятно откуда уши растут :) Очень сильно завимсит от стркуктуры данных Если одному ID соoтdетствует только один Caption и в результате запроса надо и то и другое то и группировать по обоим полям ибо через месяц не поймешть зачем там макс. Если одному ID соответствует несколько Caption то, имхо, это уже надо логически обосновывать что там - мин макс или группа Второй пример ближе к телу и опять когда читаешь результат долго думаешь - засчем предидущий оратор взял максимальное из одного вот пример
| подразделение | должность | оклад | месяц
---------------------------------------------------------------
|отдел автоматизации | начальник отдела | 100 | 1
|отдел автоматизации | начальник отдела | 100 | 2
|отдел автоматизации | начальник отдела | 100 | 3
|отдел автоматизации | начальник отдела | 100 | 4
|отдел автоматизации | начальник отдела | 100 | 5
|Отдел продаж | начальник отдела | 100 | 3
|Отдел продаж | начальник отдела | 100 | 4
|Отдел продаж | начальник отдела | 100 | 5
в отчете надо по подразделению по должности суммарный оклад можно написать
select подразделение, должность, sum(оклад)
...
group by подразделение, должность
а можно и select подразделение, max(должность), sum(оклад)
...
group by подразделение, должность
и на приведенных данных результат будет одинаковый. Но только на приведенных данных. И разгибай потом почему в отделе зарплату получала только уборщица Поэтому с максами (как и с минами) по текстам надо быть предельно аккуратным и с точки зрения дальнейшего сопровождения и понимания написанного. Не знаю ка кэто сказывается на быстродействии. Но на понимании того, что в запросе написано - мое мнение - лишние функции они лишние. мешают.
-
Наверно, я чего-то не понял, но о каких ИД идет речь в АГРЕГАТНЫХ запросах ?
|