Работа с БД
У меня программа работает с базой данных довольного большого размера. В одном из полей базы хранятся данные в текством формате, которые многократно повторяются (т.е., например, в базе 100 полей со значением 'vasya', 200 со значением 'petya', 300 со значением 'masha' и все они перемешаны). Мне нужно вывести список неповторяющихся элементов (в данном случае 'vasya, petya, masha'). Раньше я делал так: создавал объект TStringList, добавлял в него значение из первой строки БД, а затем просматривал все записи в базе, и если в объекте TStringList не было какого-либо значения, я добавлял его. Все это прекрасно работает, но просмотр всей базы занимает достаточно длительное время. Нет ли способа лучше?
select distinct(FieldName) from table
С distinct надо работать осторожней. Он сильно замедляет выполнение запроса.
id - идентификатор записи(Primary Key not null unique)
Name - имя на него также уникальный индекс.
А в твоей таблице вмсето поля с именами использовал бы Foreign Key на созданную табличку.
И по этому полю тоже индекс, только не уникальный. Тогда и работа проще будет. И лишних distinct не надо будет юзать.
А еще есть такое понятие как нормализация данных. В твоем случае я бы создал табличку из двух полей:
id - идентификатор записи(Primary Key not null unique)
Name - имя на него также уникальный индекс.
А в твоей таблице вмсето поля с именами использовал бы Foreign Key на созданную табличку.
И по этому полю тоже индекс, только не уникальный. Тогда и работа проще будет. И лишних distinct не надо будет юзать.
Просто таблица уже есть и её используют несколько приложений, и поэтому изменения в структуре таблицы крайне нежелательны.
Просто таблица уже есть и её используют несколько приложений, и поэтому изменения в структуре таблицы крайне нежелательны.
А CREATE VIEW что со вчерашнего дня отменили???
Переименовываешь исходную таблицу и нормализуешь ее. А после этого создаешь View(что-то типа select t.1field, t.2field, n.name from table1 t inner join name n on t.fkey = n.id) с имененм как у таблицы в начале и счастье будет тебе. Все старые проги и модули ничего и не заметят а тебе потом легче станет.
А CREATE VIEW что со вчерашнего дня отменили???
Переименовываешь исходную таблицу и нормализуешь ее. А после этого создаешь View(что-то типа select t.1field, t.2field, n.name from table1 t inner join name n on t.fkey = n.id) с имененм как у таблицы в начале и счастье будет тебе. Все старые проги и модули ничего и не заметят а тебе потом легче станет.
Я немного ступил :]
Камрады, а может, можно и без нормализации обойтись ? :)
Насколько я понял первое сообщение, все проблемы решаются проще:
Dim rs_01 as RecordSet
Set rs_01 = CurrentDb.OpenRecordSet("SELECT Таблица.Поле FROM Таблица GROUP BY Таблица.Таблица;")
[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 работать???
Как говорится, век живи, век учись.
:)