填充多对多表

时间:2019-11-28 06:28:47

标签: sql tsql

我有两个表,“讲师”表和“部门”表。讲师可以参与许多部门,并且部门可以包含许多讲师。我试图填充DepartmentInstructor表以创建多对多关系。像这样填充表格,

部门表

DepartmentID    DepartmentName
    1           Aaron Copland School of Music
    2           American Studies
    3           Art
    4           Classical, Middle Eastern, and Asian Languages and Cultures 
    5           Comparative Literature
    6           Drama, Theatre & Dance
    7           English
    8           European Languages and Literatures 

讲师表

InstructorID      InstructorFullName
1                 Abrams, Brian
2                 Ciavarella, Peter
3                 Franklin, Arnold
4                 Shur, Mitchell
5                 Reich, Toby
6                 Meyers, Allison
7                 Dana, Kathryn
8                 Rhindress, Mindy

我想做的是

DepartmentInstructor表

DepartmentID  InstructorID
1             3
3             7
2             7
6             4

编辑:

响应@GeorgeJoseph,我们还得到了一个表格,其中包含ID以外的所有数据。该表如下所示,

表X

Semester   Sec  Code    Course(HR,CRD)  Description     Day             Time                Instructor          Location   Enrolled    Limit      ModeOfInstruction
Spring 2019 02  37366   ACCT 100 (3, 3) Fin & Mgr Acct  T, TH           3:10 PM - 4:25 PM   Milo, Michael       KY 419         20        22         In-Person
Spring 2019 03  37823   ACCT 100 (3, 3) Fin & Mgr Acct  M               3:10 PM - 6:00 PM   Ho, Vivian          HH 17          21        22         In-Person
Spring 2019 01  37365   ACCT 100 (3, 3) Fin & Mgr Acct  T, TH           10:45 AM - 12:00 PM Milo, Michael       KY 419         22        22         In-Person
Spring 2019 06  7351    ACCT 101 (4, 3) Int Theo & Prac Acct 1  T, TH   12:10 PM - 2:00 PM  Feisullin, Anita    RA 201         30        30         In-Person
Spring 2019 12  7357    ACCT 101 (4, 3) Int Theo & Prac Acct 1  SU      8:20 AM - 12:00 PM  Mintz, Chana        PH 204         39        55         In-Person
Spring 2019 11  7356    ACCT 101 (4, 3) Int Theo & Prac Acct 1  S       8:20 AM - 12:00 PM  Chan, Joseph        PH 110         54        55         In-Person
Spring 2019 10  7355    ACCT 101 (4, 3) Int Theo & Prac Acct 1  F       6:30 PM - 10:30 PM  Solarsh, Eva        PH 212         30        30         Hybrid
Spring 2019 09  7354    ACCT 101 (4, 3) Int Theo & Prac Acct 1  T, TH   8:50 PM - 10:30 PM  Zapf, Michael       PH 110         29        55         In-Person

我通过该表将数据添加到“教师表”和“部门”表中。我们将此表称为X。DepartmentName是通过使用Course(HR,CRD)列上的case语句创建的。

现在回答您的问题,表X应该帮助我们在教师和部门表之间形成多对多关系。我目前不确定如何映射关系。我试图做的就是这个,

  SELECT DISTINCT [Description], Instructor
    FROM Schema.X AS x
    INNER JOIN [College].[Instructor] AS I
    ON x.Instructor = I.InstructorFullName

这将给我教授教授的相应课程,但是我不确定如何从这里开始。

编辑2:

这是我的数据库设计的外观,

2 个答案:

答案 0 :(得分:0)

正如George和您自己所提到的,您快到了。
我正在使用SQL Server / T-SQL

在我的示例中,您有一个课程表,一个教师表和一个部门表。
课程表必须以教师ID和部门ID作为列。

这是弥合所有表之间的差距的方法。这意味着您具有部门,课程(具有链接的部门和导师ID)的不同列表以及不同的导师列表。有一些考虑因素,一门课程有一位以上的导师(我想可能会发生),但要测试适合您的设置的课程。可能在具有相同departmentId和第二nd tutorID的课程中添加新行。

我在输出中添加了一些额外的列。 您还可以看到并非所有部门都为其分配了课程。资金不足!
还请注意,根据您所处的情况或where子句,我在内部可能会更好用左连接的情况下使用。 EG其中courseID不为null。

http://sqlfiddle.com/#!18/cf48b/1/0

答案 1 :(得分:0)

好吧,通过一些反复试验并彻底读取数据。我已经找到了我认为是正确的解决方案,

INSERT INTO [College].[DepartmentInstructor]
    (DepartmentInstructorID, DepartmentKey, InstructorKey)
SELECT
    NEXT VALUE FOR [Project3].[SequenceObjectForDepartmentInstructorId],
    DepartmentID,
    InstructorID
FROM (
    SELECT DISTINCT InstructorID, DepartmentID
    FROM Uploadfile.CoursesSpring2019 AS CS
        INNER JOIN [College].[Instructor] AS I
        ON CS.Instructor = I.InstructorFullName
        INNER JOIN [College].[Department] AS D
        ON CS.[Course (hr, crd)] LIKE CONCAT('%', D.DepartmentName, '%')
) AS Result

我已经能够在项目中取得更大的进步,并且我已经完成了95%。我实际上偶然发现了一个类似的问题。如果您参考我发布的数据库设计,则课程表将需要多个表中的ID。这就是我想出的,

SELECT DISTINCT
        TS.TimeSlotID,
        I.InstructorID,
        BL.BuildingLocationID,
        C.CourseID
FROM Uploadfile.CoursesSpring2019 AS CS
   INNER JOIN [College].[TimeSlot] AS TS
       ON CS.[Time] = TS.[ClassHours]
   INNER JOIN [College].[Instructor] AS I
       ON CS.[Instructor] = I.[InstructorFullName]
   INNER JOIN [College].[BuildingLocation] AS BL
       ON CS.[Location] LIKE CONCAT( BL.[BuildingName], '%')
   INNER JOIN [College].[Course] AS C
       ON CS.[Course (hr, crd)] LIKE CONCAT(C.CourseName, '%')

这里的问题是此查询导致大约100万行。表X大约有4700行,这意味着我当前拥有的该查询距离我应该拥有的行数还很远。