2010-12-07 1 views
1

Резюметаблица базы данных, без внешнего ключа должна быть сдвинута по NVARCHAR поля приводит к нескольким unexisting строк

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

В это время единственное требование состояло в том, чтобы сгруппировать этот список по названию улицы. Следовательно, название улицы в адресе было достаточно.

Прошло уже третий год, когда раз в год я испытываю эту головную боль, воссоединяя названия улиц и секторы вместе. Сектор не более, чем «центр города», «верхний город», «125е», «более 125е» и «неизвестный» для улиц, которые я не могу классифицировать.

образец и структура

данных У меня есть исходная таблица, которая была создана в первый раз программное обеспечение было доставлено. Я сделаю это 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 

Objective

Я должен решить название улицы конфликт из-за OrthoGraph. Во-первых, кажется, что поле Contacts.street содержит одно значение, которое существует в Streets.streetName. Таким образом, когда я сравниваю с равным (=) знаком, я получаю только около 6000 строк, когда население города составляет около 13 000 человек.

Из-за этого, я пытаюсь соединить таблицы с как п а, но тогда я могу собрать около 20 000 строк, с дублями ФАМИЛИЕЙ, именем, гражданской, информационный телефоном комбинацией из Contacts.

В дополнение к этому, я, кажется, не хватает точности или не знаю, как сказать, но когда я использую , как, я получаю некоторые странные результаты.

Полученные результаты, например, давайте рассмотрим меня на улице 125e Рю в 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 таблицы.

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

Спасибо за любую помощь, которую вы предоставляете. =)

+0

Самый длинный .... пост .... никогда ... – 2010-12-07 04:59:14

+0

@Abe Miessler: LOL Спасибо за смех! Хотя я хочу только заплакать. Изменение потребности клиента привело меня к этому в базе данных. Я просто хотел убедиться, что у меня есть достаточно элемента, чтобы получить помощь откуда-то. =) – 2010-12-07 05:34:27

ответ

1

конечно, это не может быть это просто ...

 
select c.city 
     , s.sectorName 
     , st.streetName 
     , c.civic 
     , c.lastname 
     , c.firstname 
     , c.phone 
    from Contacts c 
     OUTER JOIN Streets st on st.streetName = c.street 
     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