Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Массовое изменение кодов в таблице

Здравствуйте!

Допустим, есть таблица Streets - список улиц, в ней 2 поля: ID (число - код

улицы) и Name (строка - название). Есть таблица People, в которой кроме всего

прочего есть поле StreetCode - код улицы из таблицы Streets. Все записи в
таблице Streets уникальны (но одно и то же название улицы может встречаться
несколько раз); записи в таблице People неуникальны. Таблица Streets
поменялась: по сравнению с исходной добавилось несколько улиц, несколько
убрано и, самое главное, коды почти всех улиц поменялись.
Теперь нужно перевести таблицу People на новые коды улиц. Допустим, в
исходной таблице улиц (пусть она называется old_streets) есть ул. Колхозная с

кодом 12, а в новой таблице (new_streets) ее код - 23. Можно поменять в табл.

People код с 12 на 23, но! в old_streets под кодом 23 стоит ул. Кулацкая,
которая в new_streets, в свою очередь, имеет код 12 (придумано специально для

пущей запутанности).
Собственно, вот и проблема. Есть ли какие-нибудь простые и элегантные
алгоритмы решения этой задачи? Может, все это можно проделать средствами SQL,

но как? Мне пока в голову не пришло ничего разумного :(
Извините, если не совсем (совсем не) по теме - кроме Pascal/Delphi ничего не

знаю, поэтому если и буду что-нибудь писать, то только на нем :)

Спасибо за ответы-советы.

Ответить   Fri, 23 Dec 2005 22:47:57 +1000 (#493433)

 

Ответы:

Не вижу проблем, если ты программёр.
На какую таблицу ссылается запись из People? Из old_streets? А надо,
чтобы из соот-щую улицу из new_streets?
Алгоритм:
1. Берёшь old_id_street из tab_people: select street_id from
tab_people where id=man_id
2. Ищешь название улицы в старой таблице улиц: select street_name from
old_streets where id=old_id_street
3. Ищешь её новый id в новой таблице улиц: select id from new_streets
where name=street_name
4. Обновляешь запись в People: update tab_people set
street_id=id_from_punkt_3 where id=id_man
фйсо

Номер выпуска : 5105
Возраст листа : 824 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/493525
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Fri, 23 Dec 2005 22:15:17 +0300 (#493525)

 

В сообщении от Суббота 24 Декабрь 2005 05:15 Николай Увалиев написал(a):

Спасибо за ответ, но ... похоже, ты не дочитал мое письмо до конца :)
В таблице old_street код ул. Колхозной - 12, а в new_street - 23; хорошо, я

в таблице People меняю все коды улиц 12 (пусть их там будет 987) на 23. Но, в

old_street код 23 имеет ул.Кулацкая, которая, в свою очередь, в new_street
имеет код 12. Я в таблице People уже поменял коды для ул.Колхозной - с 12 на

23, как я теперь среди записей с кодом улицы 23 найду старые, которые
относятся к ул.Кулацкой (а их там было 56) и которые надо поменять на новый
код - 12?
Вдобавок ко всему этому, в таблицах *_street одно и то же название улицы
может встречаться несколько раз (но с разными кодами), а в таблице People
записи вообще не уникальны...

Ответить   Sat, 24 Dec 2005 17:13:10 +1000 (#493926)

 

9A4172 пишет:

не

SQL тебе здесь не поможет. А вот с похожей задачей человек справился -
http://www.infocity.kiev.ua/prog/delphi/content/delphi192.phtml

Ответить   Oleg Ponomarev Sat, 24 Dec 2005 09:58:37 +0200 (#493929)

 

В сообщении от Суббота 24 Декабрь 2005 17:58 Oleg Ponomarev написал(a):

Спасибо, но... Это статья про нечеткое сравнение строк, к тому же она уже
есть у меня на винте :)

Ответить   Sun, 25 Dec 2005 21:38:16 +1000 (#494432)

 

Прошу прощения, но что-то не пойму, что Вы мучаетесь и обсуждаете.
Хотя ладно, со всеми бывает.
Рассуждения такие:

1. есть old_streets, на которую ссылается People и new_streets
2. названия улиц неуникальны (странно, ну да ладно), поэтому соответствие
старых и новых кодов old_streets и new_streets должно быть задано явно,
например, колонкой OLD_ID в new_streets, содержащей старый код
или null (для новых записей)
3. прямая замена StreetCode в People невозможна, отсюда вывод -
записям должен быть назначен новый код, не трогая
старый; варианты на любой вкус:
- в цикле по new_streets заполняется новыми кодами колонка NewStreet в
People,
а затем одним оператором переносится в StreetCode
- временная таблица со структурой, аналогичной People, если
для People нет уникального кода
- временная таблица с полями ID, StreetCode и NewStreet,
если для People есть уникальный код

Годится?

Номер выпуска : 5111
Возраст листа : 826 (дней)
Количество подписчиков : 542
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/493953
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Sun, 25 Dec 2005 13:54:47 +0300 (#493953)

 

Бывает. Кривые руки у операторов, набиравших справочник, и кривые глаза
у
корректоров, их контролировавших. Бывает дешевле отдярить им одинаковые
коды,
чем исправлять справочник, хотя это и заметание мусора под ковёр. А ещё
бывает улицы переименовывают. У нас к примеру в городе есть улица, с
переименованием которой бОльшая часть её жителей не согласна. Так она и
существует под двумя названиями уже с три года.

<skipнуто>
- оставить связующий справочник как есть и внедрить его в структуру баз
данных. Не самый умный способ, так как придётся переписывать запросы
(или что там у них используется), но тоже способ.

А вообще, мне кажется, что если отрицательных кодов нет, то можно
использовать временное представления для новых кодов их противоположными
значениями, чтоб не путались со старыми с тем же кодом, а потом всем им
поменять знаки. И всё это в рамках одной транзакции, разумеется.

--
С уважением, boroda

Номер выпуска : 5115
Возраст листа : 827 (дней)
Количество подписчиков : 542
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/494208
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Шматко А.А. Mon, 26 Dec 2005 10:34:20 +0300 (#494208)

 

В сообщении от Воскресенье 25 Декабрь 2005 20:54 Емельянов Алексей написал(a):

Извините за задержку с ответом - конец года, на работе перманентный аврал :)

В общем, идею понял, мысли думаю :) Срок исполнения отодвинут куда-то на
следующий год, а добровольно я этой фигней занималься не буду :) (все
вышеуказанные таблицы относятся к жуткой программе на FoxPro для DOS)
Прикажут - буду делать :)

Спасибо всем за ответы.

Ответить   Thu, 29 Dec 2005 21:17:22 +1000 (#495317)