Резюме
Хорошо, еще в 2007 году меня попросили выпустить крошечный программный продукт, целью которого было вводить имена людей, адрес и номер телефона в соответствии с местным телефоном.directory.
В настоящее время единственным требованием была возможность группировки этого списка по названию улицы.Следовательно, названия улиц в адресе было достаточно.
Уже третий год, как раз в год у меня возникает головная боль от объединения названий улиц и секторов вместе.Сектор не более чем «центр города», «верхний город», «125e», «более 125e» и «неизвестный» для улиц, которые я не могу классифицировать.
Образец данных и структура
У меня есть исходная таблица, которая была создана при первой поставке программного обеспечения.Я сделаю его SQL Server, так как я импортировал в него данные для простоты работы.
CREATE TABLE Contacts (
ContactId int not null identity(1, 1) primary key
, lastname nvarchar(50) not null
, firstname nvarchar(20) not null
, civic nvarchar(10) not null
, street nvarchar(20) not null
, city nvarchar(20) not null
, phone bigint not null
)
-- With the following sample data:
insert into Contacts (lastname, firstname, civic, street, city, phone)
values (N'LNAME-5551231234', N'A', N'89', N'MY STREET', N'SHAWINIGAN', 5551231234)
GO
insert into Contacts (lastname, firstname, civic, street, city, phone)
values (N'LNAME-5559879876', N'FNAME', N'10', N'YOUR STREET', N'SHAWINIGAN', 5559879876)
GO
insert into Constacts (lastname, firstname, civic, street, city, phone)
values (N'LNAME-5554564567', N'AFNAME', N'25', N'HIS STREET', N'SHAWINIGAN-SUD', 5554564567)
GO
Затем я добавил таблицы с названиями улиц с правильной орфографией и еще одну для различных секторов.
-- Sectors
CREATE TABLE Sectors (
sectorId int not null identity(1, 1) primary key
, sectorName nvarchar(20) not null
)
GO
insert into Sectors (sectorName)
values (N'Downtown')
GO
insert into Sectors (sectorName)
values (N'Upper city')
GO
-- Streets
CREATE TABLE Streets (
streetId int not null identity(1, 1) primary key
, sectorId int not null references Sectors (sectorId)
, streetName nvarchar(20) not null
)
GO
insert into Streets (sectorId, streetName)
values (1, N'My St.')
GO
insert into Streets (sectorId, streetName)
values(1, N'Ur Street')
GO
insert into Streets (sectorId, streetName)
values (2, N'HIS STREET')
GO
Что приведет к объяснению:
Sectors
sectorId | sectorName
---------------------
1 | Downtown
2 | Upper city
Streets
streetId | sectorId | streetName
--------------------------------
1 | 1 | My St.
2 | 1 | Ur Street
3 | 2 | HIS STREET
Contacts
contactId | lastname | firstname | civic | street | city | phone
--------------------------------------------------------------------------------------------
1 | LNAME-5551231234 | A | 89 | My Street | SHAWINIGAN | 5551231234
2 | LNAME-5559879876 | FNAME | 10 | Your Street | SHAWINIGAN | 5559879876
3 | LNAME-5554564567 | AFNAME | 25 | HIS STREET | SHAWINIGAN-SUD | 5554564567
Цель
Мне удалось разрешить конфликт названий улиц из-заOrthoGraph.Во-первых, кажется, что поле Contacts.street
содержит одно значение, которое существует в Streets.streetName
.Таким образом, когда я сравниваю со знаком равенства (=
), я получаю только около 6000 строк, когда население города составляет около 13 000 человек.
Из-за этого я пытаюсь объединить таблицы с как предложение , но тогда я могу собрать около 20 000 строк, с дубликатами фамилии, имени, гражданского лица, телефонной информации из Contacts
.
В дополнение к этому, мне кажется, не хватаетточности или не знаю, как сказать, но когда я использую как , я получаю некоторые странные результаты.
Полученные результаты, например, давайте посмотрим, у меня естьулица 125e Rue в Streets
, и имеющая 12e Rue , 25e Rue в Contacts
, то выглядит так, что Контакт дублируется, потому что обе улицывстретить как шаблон.(Было бы намного проще понять производственные данные, но это адреса людей и телефонные номера, поэтому я не могу ...)
Запросы, соблазненные до сих пор
Этот запрос создает вид вышеупомянутой дублирующейся информации, но только дублирующую информацию из Contacts
, так как Streets.streetName
изменяется от записи к другой в объеме этого запроса.Кроме того, этот запрос выглядит, как если бы было несколько адресов, например, для LASTNAME-5551231234 .
select c.city
, s.sectorName
, st.streetName
, c.civic
, c.lastname
, c.firstname
, c.phone
from Contacts c
inner join Streets st on st.streetName like N'%' + c.street + N'%'
inner join Sectors s on s.sectorId = st.sectorId
group by c.city
, s.sectorName
, st.streetName
, c.civic
, c.lastname
, c.firstname
, c.phone
order by c.city
, s.sectorName
, st.streetName
, c.civic
, c.lastname
Еще один запрос, на который я бы хотел вдохновить себя.из-за того, что, похоже, он дает правильные результаты, когда мы удаляем как можно больше информации из таблицы Contacts
.
Наконец, я довольно запутался и не ожидаю, что кто-то из васПрофессиональные разработчики и администратор базы данных могут помочь мне с одним простым ответом, но с пошаговым руководством и эмпирическим подходом, поэтому я готов попробовать все, что вы можете вспомнить, о чем я еще не подумал.
Спасибоза любую помощь, которую вы оказываете.=)