编写查询以规范化 table
Writing query to normalize a table
我需要编写查询以规范化 table。
我目前拥有的table有这些属性,table名字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
的新 table,这个 table 将包含列 STATE
、CITY
和ZIP
。
到目前为止,我编写了以下查询,但显然它生成了很多行,我找不到与原始查询的联系 table。
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
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')
我不完全确定邮政编码在美国是如何工作的,但假设一个州可以有多个城市,一个城市可以有多个邮政编码,我将执行以下操作来规范化数据库
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 表看起来像......
CUS_ID ZIP_ID CUS_PHONE CUS_NAME
1 11111 1111111111 G
2 33212 1233123123 H
3 55555 6666666666 E
我需要编写查询以规范化 table。
我目前拥有的table有这些属性,table名字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
的新 table,这个 table 将包含列 STATE
、CITY
和ZIP
。
到目前为止,我编写了以下查询,但显然它生成了很多行,我找不到与原始查询的联系 table。
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
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')
我不完全确定邮政编码在美国是如何工作的,但假设一个州可以有多个城市,一个城市可以有多个邮政编码,我将执行以下操作来规范化数据库
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 表看起来像......
CUS_ID ZIP_ID CUS_PHONE CUS_NAME
1 11111 1111111111 G
2 33212 1233123123 H
3 55555 6666666666 E