2016-07-29 4 views
3

이것은 아마도 매우 기본적인 것일뿐입니다.테이블 자체에 테이블 조인 SQL

나는 두 개의 테이블을 가지고 있는데 하나는 학생들이 어떤 수업을하고 있는지를 보여주고 다른 하나는 각 학생이받은 성적을 보여줍니다. 나는 어떤 과목에서 어떤 학생들이 성적이 없는지 알아 보려고한다.

내가 성적을해야합니까 클래스에서 학생들의 목록을 발견 시작점으로이 코드를 작성을 :

치료를 작동
SELECT mem.student_id, mem.class_id 
FROM class_memberships as mem 
inner join grades as gr 
on mem.student_id = gr.student_id 
where mem.class_id = 12 and gr.grade_type = 18 

,하지만 실제로 필요로하는 것은에서 학생입니다 계급이없는 계급, 그렇지 않은 계급. 나는 다음과 같이 내가 바로 회원 테이블에 대해 조인 수 있다고 생각하지만, 그것은 작동하지 않았다

SELECT mem.student_id, mem.class_id 
FROM class_memberships as mem 
inner join grades as gr 
on mem.student_id = gr.student_id 
right join class_memberships as mem2 
on mem.student_id = mem2.student_id 
where mem.class_id = 12 and gr.grade_type = 18 
and mem.student_id is null 

은 위의 모든 행을 반환하지 않습니다와 나는 한 학생은 등급이없는 것을 알고있다. 위의 예제를 얻기 위해 SQL 오른쪽 조인에 대한 예제를 따라했습니다. 나는 'mem.student_id가 null'조항으로 인해 작동하지 않는 것 같지만 Google의 모든 cheatsheets은 내가 필요하다고 말했다.

도와주세요. 나는 SQL에 대한 초보자 (그리고 일반적으로 코딩하기 때문에) 이것은 아마도 매우 기본적인 것이지만 어디에서나 대답을 찾을 수는 없다. 고마워요 :)

+4

SQL Server 인 경우 Google의 'SQL Server NOT EXISTS'입니다. 또한이 질문에 대한 RDBMS 태그. – dfundako

+0

참고로, 아무도'RIGHT JOIN'을 사용하지 않습니다. 'LEFT JOIN' 예, 그렇지만 보통'RIGHT JOIN'을 사용하려고하면 LEFT JOIN이됩니다. 가장 작은 테이블부터 시작하여 필요한 것을 찾으십시오. – SQLMason

답변

1

:

SELECT student_id 
FROM class_membership 
LEFT JOIN grades ON (class_membership.student_id = grades.student_id 
    AND class_membership.class_id = grades.class_id) 
WHERE grades.student_id IS NULL 

class_membership 이미 모든 학생들이 나열된 항목 중 어느 항목에 등급이 없는지 알아 내기만하면됩니다. 즉, 해당 등급의 항목이 null 일 것입니다.

+0

감사합니다. 나는 따라하기 위해 노력한 가이드를 이해하지 못했고, 그래서 나는 null 인 성적을 찾아야한다는 것을 알지 못했습니다. 설명 주셔서 감사합니다! – grumpasaurus

1

실제로, 당신은 LEFT JOINgrades에 실제로해야합니다. LEFT JOIN은 해당 grades 레코드가 있는지 여부와 상관없이 모든 class_memberships 레코드를 표시합니다. 그런 다음 등급

SELECT mem.student_id, mem.class_id 
FROM class_memberships as mem 
LEFT JOIN grades as gr ON mem.student_id = gr.student_id 
WHERE mem.class_id = 12 
AND gr.id IS NULL --I'm not sure what your pk field is for your grades table 
+0

그것은 훌륭합니다, 나는 gr.id를 할 수 있다는 것을 몰랐습니다. null입니다!감사합니다. – grumpasaurus

0
에게이없는 레코드를 필터링 할 수 있습니다
SELECT mem.student_id, mem.class_id 
FROM class_memberships as mem 
inner join grades as gr 
on mem.student_id = gr.student_id 
where mem.class_id = 12 
and gr.student_id NOT EXISTS (select student_id from class_memberships where class_membership is null) 
당신은 아마 전혀 가입 3 방법이 필요하지 않습니다
0

은 당신이 찾고있는 무슨 NOT EXISTS이다 : 그러나

SELECT m.student_id, m.class_id 
FROM class_memberships m 
WHERE m.class_id = 12 AND 
     NOT EXISTS (SELECT 1 
        FROM grades g 
        WHERE g.student_id = m.student_id AND gr.grade_type = 18 
       ); 

, 당신의 데이터 구조에 대한 매우 의심스러운입니다.

SELECT m.student_id, m.class_id 
FROM class_memberships m 
WHERE m.class_id = 12 AND 
     NOT EXISTS (SELECT 1 
        FROM grades g 
        WHERE g.student_id = m.student_id AND g.class_id = m.class_id 
       ); 

그러나, 나는 데이터 구조를 오해 될 수 있습니다 I 클래스에 대한 링크뿐만 아니라 학생을 가지고 grades을 기대.

0

이 고장이

곳 mem.class_id = 12 gr.grade_type = 18

왜 두 번 같은 테이블에 가입?

SELECT mem.student_id, mem.class_id 
FROM class_memberships as mem 
left join grades as gr 
     on mem.student_id = gr.student_id 
     and gr.grade_type = 18 
where gr.student_id is null 
    and mem.class_id = 12