поиск и замена ??????

igor701
Дата: 06.12.2009 16:41:55
Существует таблица Otchet 30 000 строк в которой есть поле Станция.
Данные в эту таблицу импортированы из Excel
Вообще наименований станций по определению 365. Но из за человеческого фактора данные внесены были с ошибками. Например: Правильно так Терень-Узек а написано Терень Узек , Терень Узяк или Терень-Узяк.
Как заменить наименования станций в таблице Otchet на правильные они записаны в таблице Stancii.
Самое короткое наименование станции состоит из 4 букв.
Таблица Stancii содержит 365 записе правильно написанных наименований станций.
ё
Дата: 06.12.2009 17:22:44
а в Эксель они попали откуда? вручную вносились?
самое правильное было б - не дать им там появлятся - что бы названия не вписывались, а выбирались из списка...

если это разовая операция,
то можно выбрать из Otchet все "человеческо-факторные" названия
SELECT DISTINCT Станция
FROM Otchet 
WHERE Станция NOT IN (SELECT Станция FROM Stancii)
и проапдейтить в Otchet неправильное название правильным

если же эта операция будет повторятся время от времени
стоит завести табличку "Аналоги названий станций"

АналогНазванияСтанции - текст - ключ
НазваниеСтанции (лучше конечно ID станции)

и заполнить её
будет что-то типа
АналогНазванияСтанцииНазваниеСтанции
Терень Узек Терень-Узек
Терень Узяк Терень-Узек
Терень-Узяк Терень-Узек

при загрузке нового Otchet - апдейтить поле Станция
...ну и само-собой прийдется, время от времени - пополнять Аналоги новыми "придумками"
Rivkin Dmitry
Дата: 06.12.2009 17:34:42
Это не человеческий фактор, а грубое отступление от правил ведения баз данных. Нельзя вносить в таблицы справочные данные вручную - их надо выбирать из справочников! Что теперь делать? Голову ломать теперь придется!
Во-первых, убедиться, что в таблице-справочнике станций кроме поля "Наименование" есть числовой индитификатор названия-Id (простейший спопосб - поле счетчик). Во-вторых, убедиться, что в таблице Otchet так же есть аналогичное поле (пока не заполненое). Далее, возможны варианты. Я бы сделеал временную таблицу:
select distinct Name, 0 As Id into Tmp from Otchet 
Создал бы временную форму, с источником эта таблица. Источник первого контрола (текстбокс) - поле Name, второй контрол - комбобокс (источник таблица "Сбанции") - выводимое значение - первое поле - индекс - всего два поля, первое - невидимое. Затем ручками пройтись по всем записям в табле Tmp через форму и указать, что и Терень Узек и Терень Узяк и Терень-Узяк - это
Некоторое облегчение, возможно, даст сортировка формы по полю Name.
Терень-Узек. По окончании редактирования делаем обновление таблицы Otchet
update Otchet  set id = Tmp.id 
from Otchet 
inner join Tmp 
on Otchet.Name = Tmp.Name
После этого поле Name в табле Otchet убивается и никогда больше не вводится!
igor701
Дата: 06.12.2009 17:41:55
ё,
да данные вбивались вручную и сейчас вбиваются отчеты предостовляются другим предприятием и изменить форму их занесения нет возможности. по поводу таблицы аналога станции это примерно 300 записей и отслеживать ошибки и добовлять постоянно новые не получичится.
Вот думаю можно ли сделать так чтоб название каждой станции проверялось с правильным списком и принахождении максимального совпадения осуществлялся выбор. Такое возможно или нет ????
ё
Дата: 06.12.2009 18:47:51
igor701
изменить форму их занесения нет возможности

"форма внесения" котрая допускает получение такого результата,
"формой внесения" называтся не имеет права
но, опять же из разряда полумер - может проверку правильности ввода внедрить в тот шаблон Экселя,
по которому формируется файл
ну и пусть выпрыгует юзеру сообщение, что "такая станция не найдена в справочнике станций"

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


...а что такое максимальное совпадение?
...так, если ограничится исходными данными, то вроде как можно написать функцию
которая будет возвращать исходное слово из которого удалены гласные и НЕ буквы и сравнивать
станции из Otchet и из Stancii, преобразованные этой функцией
типа
F("Терень-Узек") = ТРНЗК
F("Терень-Узяк") = ТРНЗК
но всё это до того момента, пока кто-то не напишет - Терень-Усяк или
не втулит туда латин.букву - Теpень-Узяк

одним словом, всё это напоминает "героическое преодоление трудностей", - которые сам себе и создаеш..

вопщем, я согласен с Rivkin Dmitry - надо сразу делать "так как правильно"
...ну или готовится лопатить это в ручную
mds_world
Дата: 06.12.2009 22:24:20
По поводк "делать, как правильно". Был большой топик на эту тему - Фильтруем пользовательский ввод (набор вредных правил, сбор идей )