编写查询以规范化表

时间:2015-04-06 20:07:03

标签: sql sql-server tsql normalization

我需要编写查询才能规范化表格。

我目前拥有的表具有这些属性,表名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的新表,该表将包含STATECITYZIP列。

到目前为止,我编写了以下查询,但显然它生成了很多行,我找不到与原始表的连接。

CREATE TABLE dbo.Territory
(STATE nvarchar(255), CITY nvarchar(255),ZIP nvarchar(255));

INSERT INTO dbo.Territory(STATE,CITY,ZIP)
SELECT STATE,CITY,ZIP FROM dbo.oldTable;

这是正确的方法吗?我在MS SQL Server 2014上

2 个答案:

答案 0 :(得分: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)

任何borderid都必须引用dbo.territory中id列中已存在的值。

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

答案 1 :(得分: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

现在你的Customers Tables看起来像.......

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