2015-04-06 47 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

在美国(以及世界其他地区),反规范化的一些细节很好,特别是当涉及到客户地址数据时。 –