У меня есть студенческая таблица Student (LRN, fName, lName, levelID) и таблица классов GRADE (subjectID, grade, levelID, LRN, TimeAdded). Я хочу показать всем учащимся все предметы с оценками в режиме онлайн. Я устал от этого запроса, но получил эти результаты.
Query: SELECT student.LRN, student.fName, student.lName,
(SELECT grade.grade WHERE grade.subjectID = 'k2arts') AS 'k2arts',
(SELECT grade.grade WHERE grade.subjectID = 'k2math') AS 'k2math',
(SELECT grade.grade WHERE grade.subjectID = 'k2eng') AS 'k2eng',
(SELECT grade.grade WHERE grade.subjectID = 'k2valed') AS 'k2valed',
(SELECT grade.grade WHERE grade.subjectID = 'k2fil') AS 'k2fil'
from student RIGHT JOIN grade on grade.LRN=student.LRN
Результаты: Результат запроса
Вы хотите установить отношение СТУДЕНТА в каждом подзапросе. Вам не нужно вступать в Grade
в основной запрос, так как вы не используете какие-либо его значения, кроме как в виде подзапросов, которые в этом случае не связаны между собой:
SELECT student.LRN, student.fName, student.lName,
(SELECT grade.grade FROM grade WHERE grade.subjectID = 'k2arts' AND grade.LRN=st.LRN) AS 'k2arts',
(SELECT grade.grade FROM grade WHERE grade.subjectID = 'k2math' AND grade.LRN=st.LRN) AS 'k2math',
(SELECT grade.grade FROM grade WHERE grade.subjectID = 'k2eng' AND grade.LRN=st.LRN) AS 'k2eng',
(SELECT grade.grade FROM grade WHERE grade.subjectID = 'k2valed' AND grade.LRN=st.LRN) AS 'k2valed',
(SELECT grade.grade FROM grade WHERE grade.subjectID = 'k2fil' AND grade.LRN=st.LRN) AS 'k2fil'
from student st
Пытаться:
SELECT student.LRN, student.fName, student.lName,
CASE WHEN grade.subjectID = 'k2arts' THEN grade.grade END AS 'k2arts',
CASE WHEN grade.subjectID = 'k2math' THEN grade.grade END AS 'k2math',
CASE WHEN grade.subjectID = 'k2eng' THEN grade.grade END AS 'k2eng',
CASE WHEN grade.subjectID = 'k2valed' THEN grade.grade END AS 'k2valed',
CASE WHEN grade.subjectID = 'k2fil' THEN grade.grade END AS 'k2fil'
from student
LEFT JOIN grade
on grade.LRN=student.LRN ;
Вы можете использовать левое соединение и случай, когда
SELECT student.LRN, student.fName, student.lName,
case when grade.subjectID = 'k2arts' then grade.grade else null end AS 'k2arts',
case when grade.subjectID = 'k2math' then grade.grade else null end AS 'k2math',
case when grade.subjectID = 'k2eng' then grade.grade else null end AS 'k2eng',
case when grade.subjectID = 'k2valed' then grade.grade else null end AS 'k2valed',
case when grade.subjectID = 'k2fil' then grade.grade else null end AS 'k2fil'
from student
LEFT JOIN grade on grade.LRN=student.LRN
и в конечном итоге использовать фальшивую функцию агрегации для удаления null
SELECT student.LRN, student.fName, student.lName,
min(case when grade.subjectID = 'k2arts' then grade.grade else null end) AS 'k2arts',
min(case when grade.subjectID = 'k2math' then grade.grade else null end) AS 'k2math',
min(case when grade.subjectID = 'k2eng' then grade.grade else null end) AS 'k2eng',
min(case when grade.subjectID = 'k2valed' then grade.grade else null end) AS 'k2valed',
min(case when grade.subjectID = 'k2fil' then grade.grade else null end) AS 'k2fil'
from student student.LRN, student.fName, student.lName
LEFT JOIN grade on grade.LRN=student.LRN
group by
THEN
.