Home  >  Q&A  >  body text

Switch a column when joining two SQL tables

The scenario is if I have a student table and they have 4 classes and they only know the room number. There are also two tables, one with the teacher's name and room number, the other with the teacher's name and the subjects they teach. Now the students want to know who is their math teacher, they just want the student name and the math teacher name.

This is a fictional scenario for a voucher project I'm working on. I've gotten it to work in many situations, but it's very slow. The case condition for creating the new column doesn't slow down anything and I left join the tables using the same case condition since we don't know which column to relate the student table to the teacher table. The case condition in the left join seems to be causing the trouble, is there any other method I can use to get the same result without the delay?

P粉285587590P粉285587590236 days ago365

reply all(1)I'll reply

  • P粉514458863

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

    I think the reason you're having so many problems is that your architecture isn't very good. Specifically the schema of the students table where there is a column for each course/room number.

    I first used a subquery to correct this problem, for example:

    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" like this will give you a nice clean Student Name | Period | Room schema that will make solving this problem much easier.

    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';

    reply
    0
  • Cancelreply