Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQL将表拆分为多个表_Sql_Sql Server - Fatal编程技术网

如何使用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提供任何有用的信息。如果你愿意,你可以添加一个规范化示例