I have 3 table, Application, School, Student
Table School :
id | name | school_code |
---|---|---|
0 | sch_1 | 001 |
1 | sch_2 | 002 |
2 | sch_3 | 003 |
3 | sch_4 | 004 |
4 | sch_5 | 005 |
5 | sch_6 | 006 |
6 | sch_7 | 007 |
7 | sch_8 | 008 |
8 | sch_9 | 009 |
9 | sch_10 | 010 |
10 | sch_11 | 011 |
Table Application :
app_id | sch_choice_1 | sch_choice_2 | sch_choice_3 | sch_choice_4 | sch_choice_5 | sch_choice_6 | sch_choice_7 | sch_choice_8 | sch_choice_9 | sch_choice_10 | student |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 1 |
2 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 2 |
3 | 1 | 9 | 0 | 8 | 7 | 2 | 6 | 3 | 5 | 4 | 3 |
Table Student :
id | name |
---|---|
1 | student1 |
2 | student2 |
3 | student3 |
I want to select the school choices for each student with the school detail.
My ideal output is like below
app_id | student | name1 | school_code1 | name2 | school_code2 | name3 | school_code3 | name4 | school_code4 | name5 | school_code5 | name6 | school_code6 | name7 | school_code7 | name8 | school_code8 | name9 | school_code9 | name10 | school_code10 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | sch_1 | 001 | sch_2 | 002 | sch_3 | 003 | sch_4 | 004 | sch_5 | 005 | sch_6 | 006 | sch_7 | 007 | sch_8 | 008 | sch_9 | 009 | sch_10 | 010 |
2 | 2 | sch_10 | 010 | sch_9 | 009 | sch_8 | 008 | sch_7 | 007 | sch_6 | 006 | sch_5 | 005 | sch_4 | 004 | sch_3 | 003 | sch_2 | 002 | sch_1 | 001 |
I have tried using left join , but in order to get all the 10 choices school details I will have to left join the School table 10 times. Is there any better ways to get the same output?
SQL that currently using is like below :
select
app.app_id,
app.student,
r1.NAME as name1,
r1.SCHOOL_CODE as school_code1,
r2.NAME as name2,
r2.SCHOOL_CODE as school_code2,
r3.NAME as name3,
r3.SCHOOL_CODE as school_code3,
r4.NAME as name4,
r4.SCHOOL_CODE as school_code4,
r5.NAME as name5,
r5.SCHOOL_CODE as school_code5,
r6.NAME as name6,
r6.SCHOOL_CODE as school_code6,
r7.NAME as name7,
r7.SCHOOL_CODE as school_code7,
r8.NAME as name8,
r8.SCHOOL_CODE as school_code8,
r9.NAME as name9,
r9.SCHOOL_CODE as school_code9,
r10.NAME as name10,
r10.SCHOOL_CODE as school_code10
from
T_APPLICATION app
left join T_SCHOOL r1 on r1.ID = app.SCH_CHOICE1
left join T_SCHOOL r2 on r2.ID = app.SCH_CHOICE2
left join T_SCHOOL r3 on r3.ID = app.SCH_CHOICE3
left join T_SCHOOL r4 on r4.ID = app.SCH_CHOICE4
left join T_SCHOOL r5 on r5.ID = app.SCH_CHOICE5
left join T_SCHOOL r6 on r6.ID = app.SCH_CHOICE6
left join T_SCHOOL r7 on r7.ID = app.SCH_CHOICE7
left join T_SCHOOL r8 on r8.ID = app.SCH_CHOICE8
left join T_SCHOOL r9 on r9.ID = app.SCH_CHOICE8
left join T_SCHOOL r10 on r10.ID = app.SCH_CHOICE10
CodePudding user response:
You can use subquery instead of join
select
app_id,
student,
(select name from T_SCHOOL where id=sch_choice_1) as name1,
(select school_code from T_SCHOOL where id=sch_choice_1) as school_code1,
(select name from T_SCHOOL where id=sch_choice_2) as name2,
(select school_code from T_SCHOOL where id=sch_choice_2) as school_code2,
......
(select name from T_SCHOOL where id=sch_choice_10) as name10,
(select school_code from T_SCHOOL where id=sch_choice_10) as school_code10,
from T_APPLICATION
However, it would be better to store each choice in one row and modify the T_APPLICATION table to (app_id, student_id, school_id, order)