Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с БД

507
25 марта 2003 года
PASS
45 / / 20.09.2000
У меня программа работает с базой данных довольного большого размера. В одном из полей базы хранятся данные в текством формате, которые многократно повторяются (т.е., например, в базе 100 полей со значением 'vasya', 200 со значением 'petya', 300 со значением 'masha' и все они перемешаны). Мне нужно вывести список неповторяющихся элементов (в данном случае 'vasya, petya, masha'). Раньше я делал так: создавал объект TStringList, добавлял в него значение из первой строки БД, а затем просматривал все записи в базе, и если в объекте TStringList не было какого-либо значения, я добавлял его. Все это прекрасно работает, но просмотр всей базы занимает достаточно длительное время. Нет ли способа лучше?
295
25 марта 2003 года
gray_k
356 / / 20.12.1999
Цитата:
Originally posted by PASS
У меня программа работает с базой данных довольного большого размера. В одном из полей базы хранятся данные в текством формате, которые многократно повторяются (т.е., например, в базе 100 полей со значением 'vasya', 200 со значением 'petya', 300 со значением 'masha' и все они перемешаны). Мне нужно вывести список неповторяющихся элементов (в данном случае 'vasya, petya, masha'). Раньше я делал так: создавал объект TStringList, добавлял в него значение из первой строки БД, а затем просматривал все записи в базе, и если в объекте TStringList не было какого-либо значения, я добавлял его. Все это прекрасно работает, но просмотр всей базы занимает достаточно длительное время. Нет ли способа лучше?


select distinct(FieldName) from table
С distinct надо работать осторожней. Он сильно замедляет выполнение запроса.

358
25 марта 2003 года
moonmike
423 / / 18.10.2002
А еще есть такое понятие как нормализация данных. В твоем случае я бы создал табличку из двух полей:
id - идентификатор записи(Primary Key not null unique)
Name - имя на него также уникальный индекс.
А в твоей таблице вмсето поля с именами использовал бы Foreign Key на созданную табличку.
И по этому полю тоже индекс, только не уникальный. Тогда и работа проще будет. И лишних distinct не надо будет юзать.
507
25 марта 2003 года
PASS
45 / / 20.09.2000
Цитата:
Originally posted by moonmike
А еще есть такое понятие как нормализация данных. В твоем случае я бы создал табличку из двух полей:
id - идентификатор записи(Primary Key not null unique)
Name - имя на него также уникальный индекс.
А в твоей таблице вмсето поля с именами использовал бы Foreign Key на созданную табличку.
И по этому полю тоже индекс, только не уникальный. Тогда и работа проще будет. И лишних distinct не надо будет юзать.



Просто таблица уже есть и её используют несколько приложений, и поэтому изменения в структуре таблицы крайне нежелательны.

358
26 марта 2003 года
moonmike
423 / / 18.10.2002
Цитата:
Originally posted by PASS


Просто таблица уже есть и её используют несколько приложений, и поэтому изменения в структуре таблицы крайне нежелательны.


А CREATE VIEW что со вчерашнего дня отменили???
Переименовываешь исходную таблицу и нормализуешь ее. А после этого создаешь View(что-то типа select t.1field, t.2field, n.name from table1 t inner join name n on t.fkey = n.id) с имененм как у таблицы в начале и счастье будет тебе. Все старые проги и модули ничего и не заметят а тебе потом легче станет.

507
26 марта 2003 года
PASS
45 / / 20.09.2000
Цитата:
Originally posted by moonmike

А CREATE VIEW что со вчерашнего дня отменили???
Переименовываешь исходную таблицу и нормализуешь ее. А после этого создаешь View(что-то типа select t.1field, t.2field, n.name from table1 t inner join name n on t.fkey = n.id) с имененм как у таблицы в начале и счастье будет тебе. Все старые проги и модули ничего и не заметят а тебе потом легче станет.



Я немного ступил :]

3.9K
26 марта 2003 года
Raven_n_01
3 / / 26.03.2003
[QUOTE]Originally posted by PASS


Камрады, а может, можно и без нормализации обойтись ? :)

Насколько я понял первое сообщение, все проблемы решаются проще:

Dim rs_01 as RecordSet

Set rs_01 = CurrentDb.OpenRecordSet("SELECT Таблица.Поле FROM Таблица GROUP BY Таблица.Таблица;")
3.9K
26 марта 2003 года
Raven_n_01
3 / / 26.03.2003
Ой не заметил, конечно же, GROUP BY Таблица.Поле
358
26 марта 2003 года
moonmike
423 / / 18.10.2002
Цитата:
Originally posted by Raven_n_01
[QUOTE]Originally posted by PASS


Камрады, а может, можно и без нормализации обойтись ? :)

Насколько я понял первое сообщение, все проблемы решаются проще:

Dim rs_01 as RecordSet

Set rs_01 = CurrentDb.OpenRecordSet("SELECT Таблица.Поле FROM Таблица GROUP BY Таблица.Таблица;")


Ну по пунктам.
1)Как решить вопрос выяснили сразу.
2)Нормализация была предложена как стратегическое решение а не как тактическое
3)А вот чего-то я твоего запроса не могу понять. У тебя там по чему группировка???Если по Таблица.Поле то тогда встречный вопрос с каих пор GROUP BY стал быстрее чем distinct работать???

3.9K
26 марта 2003 года
Raven_n_01
3 / / 26.03.2003
Верно говоришь, камрад, согласен по всем трем пунктам. GROUP BY гораздо медленней чем Distinct, уже на 100 000 записей ощутимо медленней, жаль что только сейчас я это обнаружил.

Как говорится, век живи, век учись.
:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог