![]() |
|
|
![]()
|
|
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
Доброго времени суток, уважаемые!
Столкнулся со следующей проблемой: имею таблицу (MS SQL Express 2008 SP3) вида:
Если нужно больше конкретики, то каждая строка определяет элемент почтового адреса (выборка из БД ФИАС): область/город... Собственно, вопрос: как, имея данные об одной записи, получить в выборке все записи "детей", "внуков" и "правнуков" (да, интересуют именно 3 уровня вложенности "потомков") Обратную задачу (получение всех предков конкретной записи) я с горем пополам решил, наверное далеко не оптимально, а вот с этой... |
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
Три запроса через юнион напиши. Если AOGUID 3 например:
Вероятно с ошибками написал. Но возможно как то так. Ну и table надо на свое название таблицы заменить. И вместо звездочки можно список полей, во всех запросах одинаковый. Это сообщение отредактировал(а) superVad - 24.7.2012, 20:41 |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
superVad, спасибо, натолкнул на идею.
Моя вина - некорректно описал задачу, которую нужно решить. Прошу прощения за "многабукав", но изложить четко и кратко не получается :( в таблице содержатся все адресные элементы: начиная от республики/области/города федерального значения (уровень 1) и заканчивая улицами/проулками/просеками (уровень 7, 8, 9). Четкой вложенности нет - уровень 7..9 может быть подчинен напрямую уровню 1, 2... Что хотелось бы (на конкретном примере): пользователю нужно ввести улицу Ленина поселка Парголово города Санкт-Петербург. Но он забыл/не знал, что ул.Ленина относится к п.Парголово и ввел в поле "название города" Санкт-Петербург, а там тоже есть такая улица. Естественно, что эти улицы разные. Соответственно, для обеспечения правильности выбора программа должна выдать дополнительные варианты, с указанием к какому именно адресному объекту относится каждый. В данном случае варианты выбора должны выглядеть как-то так: 1. ул. Ленина 2. ул. Ленина (п. Парголово). Следовательно, в итоговой выборке из БД должна содержаться не только информация о улице (уровень 7..9), но и о "вышестоящих" объектах, общим предком которых (не обязательно родителем) является введенный город. Что получилось у меня (упрощенно. @StartStr - начальные символы названия улицы, @ParentGUID - GUID введенного города):
Проблемы: 1. поиск ведется только по уровням 7..9, таким образом пользователь не имеет возможности ошибиться в названии города. 2. действует долго, первый запрос - около 5-7 секунд, остальные - около 1 секунды (индексы по полям OFFNAME, AOGUID и PARENTGUID). |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
Дамы и господа, задача решена. Запрос выполняется за 0 секунд (1 378 527 записей).
Всем спасибо за внимание, superVad - персонально за идею. БОльшую роль сыграла расстановка индексов по рекомендациям SSMS, но и запросы пришлось переделать. Удивительно, но добавление во вложенный запрос одного лишнего условия дало прирост скорости в несколько порядков. Если кому вдруг придется работать с базой ФИАС (по структуре она лучше КЛАДР-а), выкладываю получившиеся у меня запросы, вдруг пригодятся. БД была сконвертирована из dbf (OEM-кодировка) в SQLExpress своей программкой (импорт с использованием SSMS не увенчался успехом). Структура таблиц ФИАС и наименования полей при конвертировании не менялись, только убраны лишние. И то - с учетом индексов еле уложился в отведенные для Express версии 4Гб на базу. Присоединённый файл ( Кол-во скачиваний: 114 )
FIASQueries.sql 5,39 Kb |
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |