Heim  >  Fragen und Antworten  >  Hauptteil

Wechseln Sie eine Spalte, wenn Sie zwei SQL-Tabellen verbinden

Das Szenario ist, wenn ich einen Schülertisch habe und sie 4 Klassen haben und nur die Raumnummer kennen. Außerdem gibt es zwei Tabellen, eine mit dem Namen des Lehrers und der Zimmernummer, die andere mit dem Namen des Lehrers und den Fächern, die er unterrichtet. Jetzt möchten die Schüler wissen, wer ihr Mathematiklehrer ist. Sie möchten nur den Namen des Schülers und den Namen des Mathematiklehrers.

Dies ist ein fiktives Szenario für ein Gutscheinprojekt, an dem ich arbeite. Ich habe es in vielen Situationen zum Laufen gebracht, aber es ist sehr langsam. Die Case-Bedingung zum Erstellen der neuen Spalte verlangsamt nichts und ich habe die Verknüpfung der Tabellen mit derselben Case-Bedingung belassen, da wir nicht wissen, welche Spalte die Schülertabelle mit der Lehrertabelle in Beziehung setzen soll. Die case-Bedingung im linken Join scheint das Problem zu verursachen. Gibt es eine andere Methode, mit der ich das gleiche Ergebnis ohne Verzögerung erhalten kann?

P粉285587590P粉285587590236 Tage vor369

Antworte allen(1)Ich werde antworten

  • P粉514458863

    P粉5144588632024-02-27 00:26:59

    我认为您遇到这么多问题的原因是您的架构不太好。特别是学生表的架构,其中每个课程/房间号都有一列。

    我首先使用子查询来纠正这个问题,例如:

    SELECT `Student Name`, 1 as Period, `1st Room#` as Room FROM students
    UNION ALL
    SELECT `Student Name`, 2 as Period, `2nd Room#` as Room FROM students
    UNION ALL 
    SELECT `Student Name`, 3 as Period, `3rd Room#` as Room FROM students
    UNION ALL 
    SELECT `Student Name`, 4 as Period, `4th Room#` as Room FROM students

    像这样的“Unpivoting”将为您提供一个漂亮干净的 Student Name |期间 | Room 架构将使解决这个问题变得更容易。

    SELECT `Student Name`, Subject.`Teacher Name`
    FROM 
        (
          SELECT `Student Name`, 1 as Period, `1st Room#` as Room FROM students
          UNION ALL
          SELECT `Student Name`, 2 as Period, `2nd Room#` as Room FROM students
          UNION ALL 
          SELECT `Student Name`, 3 as Period, `3rd Room#` as Room FROM students
          UNION ALL 
          SELECT `Student Name`, 4 as Period, `4th Room#` as Room FROM students
        ) students
        INNER JOIN teacherRoom
           ON students.Room = teacherRoom.`Room Number`
        INNER JOIN teacherSubject
           ON teacherRoom.`Teacher Name` = teacherSubject.Subject
    WHERE teacherSubject.Subject = 'Math';

    Antwort
    0
  • StornierenAntwort