2011-01-09 67 views
2

現在,我有一個表:SQL正常化

Id - CollegeName - CourseName 

此表不歸,所以我對每1學院
很多課程,我需要歸爲兩個表如下:

Colleges: CollegeID - CollegeName 
Courses: CourseID - CollegeID - CourseName 

有沒有簡單的方法來做到這一點?
謝謝

+0

是的,我正在使用MS SQL 2008 – 2011-01-09 23:54:10

+2

我想用規範化你的意思是第三範式,但你的示例代碼並沒有違反。沒有隻依賴CollegeName的字段。如果還有CollegeMailingAddres列,那將違反3NF。 – Andomar 2011-01-10 00:11:06

+0

@Andomar沒錯,但這個重構仍然有益的原因有很多。 – 2011-01-10 00:30:30

回答

2

如果創建Colleges.CollegeID和Courses.CourseID 2個新表,因爲自動編號字段,你可以去:

INSERT INTO Colleges (CollegeName) 
    SELECT DISTINCT CollegeName 
    FROM OLdTable ; 

INSERT INTO Courses (CollegeID, CourseName) 
    SELECT Colleges.CollegeID, OldTable.CourseName 
    FROM OldTable 
     JOIN Colleges 
     ON OldTable.CollegeName = Colleges.CollegeName ; 
0

當然。

使用college_id(主鍵)列和college_name列創建一張College表,該列用作唯一索引列。

只需在課程表中引用college_id列而不是college_name。

4
CREATE TABLE dbo.College 
(
    CollegeId  int IDENTITY(1, 1) NOT NULL PRIMARY KEY, 
    CollegeName nvarchar(100) NOT NULL 
) 

CREATE TABLE dbo.Course 
(
    CourseId  int IDENTITY(1, 1) NOT NULL PRIMARY KEY, 
    CollegeId  int NOT NULL, 
    CourseName nvarchar(100) NOT NULL 
) 

ALTER TABLE dbo.Course 
    ADD CONSTRAINT FK_Course_College FOREIGN KEY (CollegeId) 
    REFERENCES dbo.College (CollegeId) 

--- add colleges 
INSERT INTO dbo.College (CollegeName) 
SELECT DISTINCT CollegeName FROM SourceTable 

--- add courses 
INSERT INTO dbo.Course (CollegeId, CourseName) 
SELECT 
    College.CollegeId, 
    SourceTable.CourseName 
FROM 
    SourceTable 
INNER JOIN 
    dbo.College ON SourceTable.CollegeName = College.CollegeName 
1

我@同意Andomar的第一個評論:去掉看似多餘的Id列和你的CollegeName, CourseName表已經在5NF。

我懷疑你需要的是進一步的表給予課程屬性,以便您可以模擬事實,例如,達勒姆大學的理學士學位。在計算科學方面與哈佛大學的A.B.相似。在計算機科學(通過屬性'計算專業','本科','country = US,'country = UK'等)。