現在,我有一個表:SQL正常化
Id - CollegeName - CourseName
此表不歸,所以我對每1學院
很多課程,我需要歸爲兩個表如下:
Colleges: CollegeID - CollegeName
Courses: CourseID - CollegeID - CourseName
有沒有簡單的方法來做到這一點?
謝謝
現在,我有一個表:SQL正常化
Id - CollegeName - CourseName
此表不歸,所以我對每1學院
很多課程,我需要歸爲兩個表如下:
Colleges: CollegeID - CollegeName
Courses: CourseID - CollegeID - CourseName
有沒有簡單的方法來做到這一點?
謝謝
如果創建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 ;
當然。
使用college_id(主鍵)列和college_name列創建一張College表,該列用作唯一索引列。
只需在課程表中引用college_id列而不是college_name。
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
我@同意Andomar的第一個評論:去掉看似多餘的Id
列和你的CollegeName, CourseName
表已經在5NF。
我懷疑你需要的是進一步的表給予課程屬性,以便您可以模擬事實,例如,達勒姆大學的理學士學位。在計算科學方面與哈佛大學的A.B.相似。在計算機科學(通過屬性'計算專業','本科','country = US,'country = UK'等)。
是的,我正在使用MS SQL 2008 – 2011-01-09 23:54:10
我想用規範化你的意思是第三範式,但你的示例代碼並沒有違反。沒有隻依賴CollegeName的字段。如果還有CollegeMailingAddres列,那將違反3NF。 – Andomar 2011-01-10 00:11:06
@Andomar沒錯,但這個重構仍然有益的原因有很多。 – 2011-01-10 00:30:30