2013-11-06 5 views
-1

Я пытаюсь выбрать номер курса из курсов, где студенты получили оценкилевое внешнее соединение с подзапроса

первый я выбираю, где студенты получили оценки для каждого grade_type_code

SELECT z.STUDENT_ID ,m.GRADE_TYPE_CODE,COUNT(*) AS COURSE_NUM 
FROM STUDENT z, GRADE m,SECTION s, COURSE w 
WHERE z.STUDENT_ID = m.STUDENT_ID 
AND m.SECTION_ID = s.SECTION_ID 
AND s.COURSE_NO = w.COURSE_NO 
GROUP BY z.STUDENT_ID,m.GRADE_TYPE_CODE 

, чем я попытаться сделать левое внешнее соединение

SELECT COURSE_NO 
FROM COURSE lt 
LEFT OUTER JOIN 
(SELECT z.STUDENT_ID ,m.GRADE_TYPE_CODE,COUNT(*) AS COURSE_NUM 
FROM STUDENT z, GRADE m,SECTION s, COURSE w 
WHERE z.STUDENT_ID = m.STUDENT_ID 
AND m.SECTION_ID = s.SECTION_ID 
AND s.COURSE_NO = w.COURSE_NO 
GROUP BY z.STUDENT_ID,m.GRADE_TYPE_CODE) rt 
ON lt.COURSE_NO = rt.COURSE_NO; 
+0

Вы присоединяетесь к 'rt.COURSE_NO', но это поле не включено в выбор вашего подзапроса. С другой стороны, вы уверены, что ваш подзапрос на самом деле возвращает ученика, у которого есть класс во всех классах? – Sebas

+0

Я звонил всю таблицу rt, мне нужно иметь ее в списке? – Manual

+1

yes, так как rt представляет ваш подзапрос, любое поле, которое вам нужно из этого псевдонима, должно быть включено в выбор подзапроса – Sebas

ответ

2
select 
    c.course_no 
from 
    course c, 
    section s, 
    grade g 
where 
    s.course_no = c.course_no and 
    g.section_id = s.section_id 
group by 
    c.course_no 
having 
    count(distinct g.grade_type_code) = 
    (select count(distinct grade_type_code) from grade); 

http://sqlfiddle.com/#!4/e7826/1/0

+4

Хороший ответ, и я его не сбиваю, но стыдно, что поиск google для «левого внешнего соединения с подзапросом» приводит к ответу SO, который не содержит левых внешних объединений. – dumbledad

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