2010-12-07 30 views
1

摘要沒有外鍵的數據庫表必須在多個unexisting行nvarchar的田間試驗結果

好了,早在2007年我被要求出示一小塊的軟件,目的是輸入人員來加盟姓名,地址和電話號碼。

目前,唯一的要求是能夠按街道名稱對此列表進行分組。因此,地址中的街道名稱就足夠了。

現在已經是第三年了,每年有一次我把這些街道名稱和部門重組在一起,這讓我很頭痛。只有「市中心」,「上游城市」,「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 

目的

我來解決街道名稱衝突,由於正射。首先,Contacts.street似乎存在Streets.streetName中存在的一個值。因此,當我與相等的(=)符號進行比較時,我只能得到大約6000行,當時城市的人口約爲13000人。

正因爲如此,我嘗試加入表,並條款,但我可以收集大約20,000行,用重複姓氏,名字,從Contacts公民,手機信息的組合。

除此之外,我似乎缺乏精確度或不知道如何說,但當我使用,我得到了一些奇怪的結果。

得到的結果是,例如,讓我們考慮一下我在街上125E街Streets,並具有12E街25E街Contacts,那麼它看起來像的聯繫是重複的,因爲這兩個街道符合的模式,如模式。 (生產數據理解起來會容易得多,但這些是人們的地址和電話號碼,所以我不能......)

查詢動心到目前爲止

,該查詢產生的那種上述重複信息,但僅從Contacts重複的信息,如從記錄Streets.streetName變化到另一個在此查詢的範圍。此外,例如,此查詢使得看起來像是有多個地址的信息,例如A 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表儘可能多的信息儘可能自己。

最後,我自己很困惑,我不希望你們中的任何一個,專業開發人員和DBA能用一個簡單的答案來幫助我,但是通過一個演練和一個實證方法,所以我願意嘗試你可能會想到的,我還沒有想到的事情。

感謝您提供的任何幫助。 =)

+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 
相關問題