Сортировка

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Pepper
Сообщения: 33
Зарегистрирован: 21 фев 2004, 23:50
Откуда: Мурманск
Контактная информация:

03 май 2004, 23:24

Здравствуй, All!
Есть проблема: нада отсортировать (отдельно одно, отдельно другое) записи по полям (Date и Amount, индексы: indDate и indAmount) но у меня ничего не выходит. Отсортировать нада с помощью Table. Я пробовал через IndexDefs.
Вот как это делал я:
Убывание для поля Date с индексом indDate:
Table1.IndexName:='indDate';
..............
Table1.IndexDefs[Table1.IndexDefs.IndexOf(Table1.IndexName)].Options:=Table1.IndexDefs[Table1.IndexDefs.IndexOf(Table1.IndexName)].Options+[ixDescending]
Возрастание - просто + заменить на -. Для поля Amount аналогично.
Подскажите, пожалуйста, что неправильно.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

22 май 2004, 23:38

Создайте все необходимые индексы и переключайте их через Table1.IndexName.

Разумеется Ascending и Descending индексы должны быть созданы отдельно.
Pepper
Сообщения: 33
Зарегистрирован: 21 фев 2004, 23:50
Откуда: Мурманск
Контактная информация:

23 май 2004, 11:53

Спасибо... а если например у меня ключевое поле Date (оно ведь не может иметь индекс - если не прав исправьте), то как мне отсортировать по этому полю?
Разумеется Ascending и Descending индексы должны быть созданы отдельно.
И подскажите, как это понять?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

25 май 2004, 00:58

Если речь идет о парадоксе, то
Поля типа Date могут быть проиндексированы, ибо они суть арифметические.
Они могут также входить и в композитные индексы (по нескольким полям).

А если не о Paradox, то давно пора уточнить, о какой базе речь. :)
GOS
Сообщения: 111
Зарегистрирован: 17 фев 2004, 10:32
Контактная информация:

25 май 2004, 12:19

Ещё добавлю, что для сортировки используются не только первичный индекс, но и вторичные(SecondaryIndex)
а там от формата поля помтоему мало что зависит... (создать можно например в DataBaseDeskTop , а в программе останется только переключить индекс)
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

26 май 2004, 07:55

а там от формата поля помтоему мало что зависит...
Бр-р-р-р-р... Это был вопрос? :) Я что-то не понял...

Во первых разберемся, что такое индекс: Среди элементов А[3], A[1], A[0] волне понятно какой стоит на первом (нулевом) месте, какой на втором, какой на третьем. Это как раз благодаря индексу.
В БД индекс это то же самое. Фактически индекс - это служебная таблица, состоящая из индексируемого поля (полей) и еще одной колонки, содержащей ссылку на реальную запись в индексируемой таблице. Эта служебная таблица всегда сортирована по всем полям, кроме последнего.

Т.е. при добавлении записи (или при изменении проиндекстрованного(ных) полей) индексная таблица перестраивается.

Для сортировки таблицы по индексу берется соответствующий индекс и сканируется. На каждом элементе индекса берется ссылка на запись (последняя колонка), а затем выборка записи по ссылке из таблицы с даными.

Примечательно, что если в запросе "select ... from table order by ..." в предложении select перечислены только поля, входящие в соответствующий индекс, то таблица с данными боычно вообще не используется - достаточно индексной таблицы!

Индексы не допускающие повторений называются уникальными.
Индексы построенные на основе нескольких полей - композитными.
Один из уникальных индексов называют (просто говорят - "пусть будет этот") - индексом первичного ключа.
Остальные уникальные называют индексами вторичных ключей (Кстати, внутри они ничем не отличаются друг от друга, кроме состава полей!).
И, наконец, неуникальные индексы называют просто индексами.
формата поля помтоему мало что зависит...
Ни о каком формате речи не идет вовсе, т.е. от формата поля (если я правильно понимаю о чем идет речь) не только мало что зависит, а не зависит вообще ничего. Числа и даты сортируются по значению, строки по алфавиту. Всё.
Pepper
Сообщения: 33
Зарегистрирован: 21 фев 2004, 23:50
Откуда: Мурманск
Контактная информация:

16 июн 2004, 21:00

Разумеется Ascending и Descending индексы должны быть созданы отдельно.
Где их надо создавать отдельно?

У меня в таблице 3 поля: Date (ключевое, но как я понял, я для него все равно могу создать индекс, поправьте, если ошибаюсь), Price (с индексом indPrice и с Decsending), Note (c индексом indNote и с Decsending).
Для того что бы организовать сортировку по убыванию, я просто переключаю индексы IndexName.
А вот как организовать сортировку по возрастанию для каждого из этих полей? Объясните еще раз, поподробнее :o ops:

Речь идет о парадоксе.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

17 июн 2004, 07:51

Используя DBD добавьте все необходимые индексы. По одному полю можно посторить 2 индекса: как прямой, так и обратный.
Date (ключевое, но как я понял, я для него все равно могу создать индекс, поправьте, если ошибаюсь)
Индекс, делающий это поле ключевым (т.е. индекс первичного ключа) (а именно благодяря индексу поле становится ключевым) тоже можно использовать для сортировки.

Т.е. у Вас 3 поля, стало быть можно объявить одно поле первичным ключом, и добавить еще 5 индексов. Тогда переключая индексы можно будет организовать сортировку по любому полю в любом направлении.

PS
Для больших таблиц держать столько индексов - очень дорогое удовольствие, поэтому на практике вместо TTable используют TQuery, подменяя в нем предложение order by в запросе, в зависимости от выбранного в данный момент режима сортировки, а индексы создают только по полям, где сортировка необходима наиболее часто.
Ответить