Wechseln Sie eine Spalte, wenn Sie zwei SQL-Tabellen verbinden
P粉285587590
P粉285587590 2024-02-26 09:29:39
0
1
424

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粉285587590
P粉285587590

Antworte allen(1)
P粉514458863

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

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

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';
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage