如何使用SQL将表拆分为多个表
嗨,我有这张桌子:如何使用SQL将表拆分为多个表,sql,sql-server,Sql,Sql Server,嗨,我有这张桌子: MODEL nvarchar(20) STYLE nvarchar(20) ENGINE nvarchar(5) CAPACITY smallint MAX_SPEED smallint PRICE smallmoney MARKET nvarchar(20) COMPETITOR nvarchar(20) 我想通过SQL查询将其分为3个表: 汽车: 发动机: ENGINE nvarchar(5) CAPACITY smallint 市场: MARKET nvarchar
MODEL nvarchar(20)
STYLE nvarchar(20)
ENGINE nvarchar(5)
CAPACITY smallint
MAX_SPEED smallint
PRICE smallmoney
MARKET nvarchar(20)
COMPETITOR nvarchar(20)
我想通过SQL查询将其分为3个表:
汽车:
发动机:
ENGINE nvarchar(5)
CAPACITY smallint
市场:
MARKET nvarchar(20)
COMPETITOR nvarchar(20)
因此,我们想知道如何使用sql命令来实现这一点,多亏了是的,这是可能的,它被称为“规范化”。是的,这是可能的,它被称为“规范化”。要规范化这些表,首先需要
创建新表,将SQL写入insert
将数据插入新表,然后alter
原始表
看
和要规范化这些表,首先需要创建
新表,将SQL写入将
数据插入新表,然后更改
原始表
看
然后运行这个
create table Engine
(
EngineId int identity(1,1) not null primary key,
Engine nvarchar(5) not null,
Capacity smallint not null
)
go
insert into Engine
(Engine, Capacity)
(select distinct Engine,Capacity from Cars)
go
alter table Cars
add EngineId int null
go
update Cars
set Cars.EngineId = e.EngineId
from Engine e where e.Engine = Cars.Engine
go
create table Market
(
Id int identity(1,1) not null primary key,
Market nvarchar(20) not null,
Competitor nvarchar(20) not null
)
go
insert into Market
(Market, Competitor)
(select distinct Market,Competitor from Cars)
go
alter table Cars
add MarketId int null
go
update Cars
set Cars.MarketId = m.MarketId
from Market m where m.Market = Cars.Market
go
alter table Cars
drop column Market;
alter table Cars
drop column Competitor;
alter table Cars
drop column Engine;
alter table Cars
drop column Capacity;
运行此
create table Engine
(
EngineId int identity(1,1) not null primary key,
Engine nvarchar(5) not null,
Capacity smallint not null
)
go
insert into Engine
(Engine, Capacity)
(select distinct Engine,Capacity from Cars)
go
alter table Cars
add EngineId int null
go
update Cars
set Cars.EngineId = e.EngineId
from Engine e where e.Engine = Cars.Engine
go
create table Market
(
Id int identity(1,1) not null primary key,
Market nvarchar(20) not null,
Competitor nvarchar(20) not null
)
go
insert into Market
(Market, Competitor)
(select distinct Market,Competitor from Cars)
go
alter table Cars
add MarketId int null
go
update Cars
set Cars.MarketId = m.MarketId
from Market m where m.Market = Cars.Market
go
alter table Cars
drop column Market;
alter table Cars
drop column Competitor;
alter table Cars
drop column Engine;
alter table Cars
drop column Capacity;
最简单的方法。选择。。。Into将创建新表:
SELECT DISTINCT
ENGINE,
CAPACITY
INTO Engine
FROM CARS
SELECT DISTINCT
MARKET,
COMPETITOR
INTO Market
FROM CARS
然后只需从原始表中删除失效的列。乙二醇
ALTER TABLE Cars DROP COLUMN ENGINE
ALTER TABLE Cars DROP COLUMN CAPACITY
ALTER TABLE Cars DROP COLUMN MARKET
ALTER TABLE Cars DROP COLUMN COMPETITOR
这将特别满足您的要求。然而,我不确定这是你想要的-然后没有从汽车到发动机或市场细节的参考-因此信息丢失
如果“ENGINE”和“MARKET”定义了新表的键,我建议将car表上的这些列保留为外键。例如只降低产能和竞争对手
您可能也希望在新表上创建主键。如:
ALTER TABLE ENGINE ADD CONSTRAINT[PK_ENGINE]主键群集引擎ASC最简单的方法。选择。。。Into将创建新表:
SELECT DISTINCT
ENGINE,
CAPACITY
INTO Engine
FROM CARS
SELECT DISTINCT
MARKET,
COMPETITOR
INTO Market
FROM CARS
然后只需从原始表中删除失效的列。乙二醇
ALTER TABLE Cars DROP COLUMN ENGINE
ALTER TABLE Cars DROP COLUMN CAPACITY
ALTER TABLE Cars DROP COLUMN MARKET
ALTER TABLE Cars DROP COLUMN COMPETITOR
这将特别满足您的要求。然而,我不确定这是你想要的-然后没有从汽车到发动机或市场细节的参考-因此信息丢失
如果“ENGINE”和“MARKET”定义了新表的键,我建议将car表上的这些列保留为外键。例如只降低产能和竞争对手
您可能也希望在新表上创建主键。如:
ALTER TABLE ENGINE ADD CONSTRAINT[PK_ENGINE]主键群集引擎ASC我删除了MySQL标记,因为smallmoney
清楚地指明了SQL Server语法。当然这是可能的。。。所以你的问题的答案是“是”。。。是吗?我想你是在问如何使它正常化。家庭作业?@samyi编辑了问题对不起,我已经说明了如何按照新表格的说明使表格正常化。我只是不知道如何使用sql命令来创建新表,然后将数据选择到表中。我删除了MySQL标签,因为smallmoney
清楚地表明了SQL Server语法。当然,这是可能的。。。所以你的问题的答案是“是”。。。是吗?我想你是在问如何使它正常化。家庭作业?@samyi编辑了问题对不起,我已经说明了如何按照新表格的说明使表格正常化。我只是不知道如何使用sql命令来创建新表,然后将数据选择到表中。这正是我想做的(你的第二段),但我认为我必须先拆分表,然后在拆分后添加外来项,尽管这是公认的答案,但我觉得它没有用处,因为它没有id字段,也没有指向原始表的链接。是的,这可以追溯到原始问题和原始表格。最后一行确实指出了如何添加主键。忽略DB snobbery,对于一个小系统,字符串主键/外键有什么问题?它并不打算向新员工解决/教授总体数据库设计。因此,非常感谢你投票否决了我对一个你没有问的问题的正确回答。这正是我想做的(你的第二段),但我认为我必须先拆分表格,然后在拆分后添加外文,即使这是公认的答案,我觉得它没有用处,因为它没有id字段,或者链接到原始表格。是的,这会返回到原始问题和原始表格。最后一行确实指出了如何添加主键。忽略DB snobbery,对于一个小系统,字符串主键/外键有什么问题?它并不打算向新员工解决/教授总体数据库设计。因此,非常感谢你投票否决了我对你没有问过的问题的正确回答。你的回答没有为OP提供任何有用的信息。如果你愿意,你可以添加一个规范化示例。你的回答没有为OP提供任何有用的信息。如果你愿意,你可以添加一个规范化示例