2013-12-18 22 views
0
表分割成多個表

您好我有這個表汽車:如何使用SQL

MODEL nvarchar(20) 
STYLE nvarchar(20) 
ENGINE nvarchar(5) 
CAPACITY smallint 
MAX_SPEED smallint 
PRICE smallmoney 
MARKET nvarchar(20) 
COMPETITOR nvarchar(20) 

而且我想通過SQL查詢到它拆分成3個表:

汽車:

MODEL nvarchar(20) 
STYLE nvarchar(20) 
MAX_SPEED smallint 
PRICE smallmoney 

引擎:

ENGINE nvarchar(5) 
CAPACITY smallint 

市場:

MARKET nvarchar(20) 
COMPETITOR nvarchar(20) 

所以徘徊這將如何使用SQL命令來完成,由於

+0

我刪除了MySQL標籤,因爲smallmoney明確指出了SQL Server語法。 –

+0

當然,這是可能的...所以你的問題的答案是「是」...是這樣嗎? –

+0

我想你想問如何正常化它。家庭作業? –

回答

2

最簡單的方法。選擇...進入將創建新表格:

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」定義了新表的鍵,我建議將這些列作爲外鍵留在車臺上。例如只有DROP能力和競爭對手。

您也可能希望在新表上創建主鍵。例如: ALTER TABLE ENGINE ADD CONSTRAINT [PK_Engine] PRIMARY KEY CLUSTERED ENGINE ASC

+0

這正是我想要做的(你的第二段),但我想我必須首先拆分表,然後在拆分後添加外來 – Anjola

+0

即使這是被接受的回答我覺得它缺乏實用性,因爲它沒有id字段,或指向原始表的鏈接。 –

+0

是的,這可以回到原始問題和原始表格。最後一行確實指出瞭如何添加主鍵。而忽略DB snobbery,對於一個小系統,字符串主鍵/外鍵有什麼問題?它並不打算將新的數據庫設計解釋/教授給新人。所以非常感謝我投票給我,因爲你沒有問過的問題正確回答。 – 2013-12-18 05:09:14

0

是的,它是可能的,它被稱爲「歸化」。

+0

您的回答沒有提供OP的任何有用信息。如果你願意,你可以添加一個正常化的例子 –

0

運行此....

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;