2016-07-29 115 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 

以上不返回任何行,我知道有一个学生没有一个档次。我跟着google上的SQL右键连接的例子来到上面。我想这是不工作的,因为'mem.student_id是空'子句,但谷歌上的所有作弊表示我需要它。

请帮忙!我是SQL的新手(一般编码),所以这可能是非常基本的,但我无法在任何地方找到答案。谢谢:)

+4

如果这是sql server,Google'SQL Server NOT EXISTS'。还要标记这个问题适用于哪个RDBMS。 – dfundako

+0

仅供参考,没有人使用'RIGHT JOIN'。 'LEFT JOIN',是...但通常如果我们倾向于使用'RIGHT JOIN'我们重写所以,这是一个'LEFT JOIN'。从最小的桌子开始,找到你需要的东西。 – SQLMason

回答

1

你也许并不需要一个3路连接都:

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已经拥有所有的学生列出来的,所以你只需要找出哪些不具备成绩,这意味着他们的“成绩”条目将为空。

+0

谢谢,我不理解我正在尝试遵循的指南,所以我没有意识到我需要查找无效的成绩。感谢您的解释! – grumpasaurus

1

其实,你真的只是需要做一个LEFT JOINgradesLEFT JOIN旨意显示所有的class_memberships记录无论是否有相应的grades记录。然后你就可以过滤掉那些没有成绩

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) 
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 
       ); 

不过,我对你的数据结构非常可疑。我希望grades不得不类的链接,以及学生:

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 
       ); 

不过,我可能会被误解的数据结构。

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