SQL Серверное комплексное объединение - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть 3 таблицы, как показано ниже

enter image description here

Я написал SQL скрипт для возврата всех предметов учащихся за определенный семестр и класс с оценкой, записана ли оценка или нет. Но приведенный ниже скрипт возвращает только записанные результаты по каждому предмету.

select 
    a.StudentId, b.SubjectId, c.Score as tCA, d.Score as tExam 
from 
    tbl_StudentToClass a
join 
    tbl_SubjectToClass b on a.ClassId = b.ClassId
join 
    (select 
         sum(Score) AS Score, SubjectId, StudentId, TermId 
     from 
         tbl_Score 
     where 
         ScoreType = 1 
     group by 
         SubjectId, StudentId, TermId) c on b.SubjectId = c.SubjectId
     join 
    (select 
         sum(Score) AS Score, SubjectId, StudentId, TermId 
     from 
         tbl_Score 
     where 
         ScoreType = 2 
     group by 
         SubjectId, StudentId, TermId) d on b.SubjectId = d.SubjectId
where 
    a.ClassId = 2 and
    a.SchoolSessionId = 5 and 
    c.StudentId = a.StudentId and 
    c.TermId = 8 and
    d.StudentId = a.StudentId and 
    d.TermId = 8

Как вернуть все предметы по выбранному классу, независимо от того, имеет ли он оценку или нет?

Пример данных:

enter image description here

1 Ответ

0 голосов
/ 25 апреля 2020

Вы присоединяетесь к таблице C, если счет отсутствует, строка отбрасывается.

Вы должны использовать левое соединение в C, как в D.

Надеюсь, это поможет!


Также я бы поставил все условия, связанные с левым соединением таблицы в представлении, а не в разделе, где.

Попробуйте эту версию и скажите, возвращает ли она теперь все нужные записи (извините, у меня сейчас нет SQL Сервер активен, и я не могу проверить его)

select 
    a.StudentId, b.SubjectId, c.Score as tCA, d.Score as t 
from 
    tbl_StudentToClass a
join 
    tbl_SubjectToClassArm b on a.ClassToClassArmId = b.ClassToClassArmId
left join 
    (select 
         sum(Score) AS Score, SubjectId, StudentId, TermId 
     from 
         tbl_Score 
     where 
         ScoreType = 1 and TermId = 1100
     group by 
         SubjectId, StudentId, TermId) c on b.SubjectId = c.SubjectId
left join 
    (select 
         sum(Score) AS Score, SubjectId, StudentId, TermId 
     from 
         tbl_Score 
     where 
         ScoreType = 2 and TermId = 1100
     group by 
         SubjectId, StudentId, TermId) d on b.SubjectId = d.SubjectId
where 
    a.ClassToClassArmId = 135 and
    a.SchoolSessionId = 1069 and 
    c.StudentId = a.StudentId and 
    d.StudentId = a.StudentId 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...