Changer de colonne lors de la jointure de deux tables SQL
P粉285587590
P粉285587590 2024-02-26 09:29:39
0
1
404

Le scénario est le suivant : j'ai une table d'étudiants et ils ont 4 classes et ils ne connaissent que le numéro de la chambre. Il y a également deux tableaux, l'un avec le nom du professeur et le numéro de chambre, l'autre avec le nom du professeur et les matières qu'il enseigne. Maintenant, les élèves veulent savoir qui est leur professeur de mathématiques, ils veulent juste le nom de l'élève et celui du professeur de mathématiques.

Il s'agit d'un scénario fictif pour un projet de bons d'achat sur lequel je travaille. Je l'ai fait fonctionner dans de nombreuses situations, mais c'est très lent. La condition de cas pour créer la nouvelle colonne ne ralentit rien et j'ai laissé joindre les tables en utilisant la même condition de cas puisque nous ne savons pas quelle colonne relier la table des étudiants à la table des enseignants. La condition de cas dans la jointure de gauche semble être à l'origine du problème. Existe-t-il une autre méthode que je peux utiliser pour obtenir le même résultat sans délai ?

P粉285587590
P粉285587590

répondre à tous(1)
P粉514458863

Je pense que la raison pour laquelle vous rencontrez tant de problèmes est que votre architecture n'est pas très bonne. Plus précisément le schéma de la table des étudiants où il y a une colonne pour chaque numéro de cours/salle.

J'ai d'abord corrigé cela à l'aide d'une sous-requête, par exemple :

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" comme celui-ci vous donnera une belle architecture propre Student Name |期间 | Room qui facilitera la résolution de ce problème.

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';
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal