2014-12-22 3 views
0

У меня есть диаграмму ER, как показано нижеSQLite «появится количество курсов для каждого студента, является ли он в Посещает или нет» запрос SQL

ER Diagram

для каждого ученика я хочу появляться все курсы, слагаемые. Поэтому я использую запрос,

select studentId,course.courseCode 
from student natural left outer join attends 
natural left outer join course 

, который дает мне все результаты в правильном направлении

enter image description here

теперь я хочу, чтобы появиться общее количество курсов, которые студент посещает и я использую этот запрос

select studentId, 
    (select count(attends.courseCode) 
    from attends natural left outer join student 
)as 'amount' 
from student 

но я имею этот результат

enter image description here

Как я могу представить реальное количество курсов для каждого учащегося независимо от того, находится он в посещении или нет? То есть, 0 для studentId 6,7,8 и 2 для studentId 17 и т.д. Спасибо заранее

PS1: Если вы хотите больше моих таблиц, пожалуйста, дайте мне знать.

PS2: Я не был уверен в названии. Если вы обнаружите, что другое название подходит лучше, просьба указать

ответ

2

Во-первых, не используйте natural join. Он полностью зависит от структуры данных - и если это изменится, то семантика запроса тоже изменится. Другими словами, вы не можете прочитать запрос и действительно понять, что он делает.

Тогда для этого запроса сначала создать список всех студентов и курсов с использованием cross join, а затем привести в информации о посещаемости:

select s.studentId, c.courseCode, count(a.CourseCode) 
from student s cross join 
    course c left join 
    attends a 
    on s.studentId = a.studentId and s.courseCode = c.courseCode 
group by s.studentId, c.courseCode; 
+0

Боюсь, что не дает мне результаты, которые я ожидал. В моем примере studentId 17 посещает 2 курса, и он возвращает, что он посещает один –

+0

и что-то еще: Могу ли я использовать левое соединение istead естественного соединения? Таким образом, мой запрос может быть «select student.studentId, course.courseCode от студента левого соединения посещает с использованием (studentId) левый курс присоединения с использованием (courseCode)'? –

+0

ОК моя ошибка Я понял, что происходит. Спасибо! –

Смежные вопросы