2015-04-06 69 views
1

我需要編寫查詢以規範化表格。寫入查詢以規範表格

我目前擁有的表有這些屬性,表名dbo.oldTable

CUS_ID STATE CITY ZIP  CUS_PHONE CUS_NAME 
1  OH  ABC  11111 1111111111 G 
2  IL  DEG  33212 1233123123 H 
3  CA  ETE  55555 6666666666 E 
//many many more lines of data 
................... 

我想在這裏實現是創建一個名爲territory新表,該表將有CITYSTATE,並ZIP

到目前爲止,我寫了下面的查詢,但顯然它產生了很多行,我找不到原始表的連接。

​​

這是做正常化的正確方法嗎?我在MS SQL Server 2014上

+0

你的問題沒有很大的意義。您的原始表格看起來不是非規範化的。但是,那麼它似乎也許是名爲inventory的表的一部分,在這種情況下,它非常規範化。如果你想要任何真正的幫助規範你的數據結構,你應該發佈整個表結構。 –

+0

@SeanLange這是,它有關於客戶的信息混合有關領土的信息 – Lamak

+0

爲什麼你不正常化到一個「國家」表和「城市」表(因爲M.阿里和我輸入相同的時間)?不幸的是,[區域改進計劃](https://en.wikipedia.org/wiki/ZIP_code)代碼比您想象的要陌生。 – HABO

回答

2
CREATE TABLE dbo.Territory 
(id int identity, STATE nvarchar(255), CITY nvarchar(255),ZIP nvarchar(255)); 

create table dbo.customer (CUS_ID int identity, territoryid int,  CUS_PHONE varchar (12), CUS_NAME varchar(25)) 

alter table dbo.customer 
ADD CONSTRAINT t_id, 
FOREIGN KEY (territoryid) 
REFERENCES dbo.Territory(id) 

任何territoryid必須引用dbo.territory中id列中已存在的值。

To insert a new customer: 
insert into dbo.customer (territoryid, cus_phone, cus_name) values (3,'212-555-1212','Mary') 
+0

M. Alis解決方案是正確的(根據三階形式),但有時過多的標準化(像大多數事情)不一定是要走的路。 –

0

我不能完全肯定郵政編碼在美國是如何工作的,但假設一個國家可以有多個城市和一個城市可以有多個郵政編碼我會做以下正常化數據庫

CREATE TABLE States 
( 
    StateID INT NOT NULL PRIMARY KEY IDENTITY(1,1) 
, StateName NVARCHAR(100) 
) 
GO 

CREATE TABLE City 
( 
    CityID INT NOT NULL PRIMARY KEY IDENTITY(1,1) 
, StateID INT REFERENCES States(StateID) 
, City NVARCHAR(100) 
) 
GO 

CREATE TABLE Zip 
( 
    ZipID INT NOT NULL PRIMARY KEY IDENTITY(1,1) 
, CityID INT REFERENCES City(CityID) 
, Zip NVARCHAR(100) 
) 
GO 

現在你的客戶表將看起來像.......

CUS_ID ZIP_ID  CUS_PHONE CUS_NAME 
1  11111  1111111111  G 
2  33212  1233123123  H 
3  55555  6666666666  E 
+0

我明白了。但我需要的是將ZIP,STATE和CITY放在一張表中 – OPK

+1

這麼做會違反標準化本身的規則,一個州可以有多個城市,所以你會重複一個州,每個城市都有郵政編碼。請注意,標準化的整個目的是爲了減少數據冗餘,您建議的是,最好將數據保持原樣。 –

+0

在美國(以及世界其他地區),反規範化的一些細節很好,特別是當涉及到客戶地址數據時。 –