右键将表连接到自己的SQL

时间:2016-07-29 20:18:05

标签: 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'条款,但谷歌上的所有备忘单都说我需要它。

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

5 个答案:

答案 0 :(得分:1)

实际上,您只需在LEFT JOIN上执行gradesLEFT 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

答案 1 :(得分: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已经列出了所有学生,因此您只需要确定哪些学生没有成绩,这意味着他们的“成绩”条目将为空。

答案 2 :(得分: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)

您要找的是function request(val, callback) { setTimeout(function() { callback(val * val);}, Math.randInt(1000));}

     <script>

       var a = function randomInteger(max) {
        var rand = 0 + Math.random() * (max + 1 - 0 -1);
        rand = Math.floor(rand);
        return rand;
        };
        function callback(dd) {
            var caaler = 20 + dd;
            return caaler;
        };
        var hh = callback(20)
        var q = a(50);
        var g = request(q,hh);
        function request(val, callback) {
      setTimeout(function() {
      callback(val * val);
  }, 3000);
}
console.log(callback(56));
        </script>

但是,我对您的数据结构非常怀疑。我希望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
                 );

但是,我可能会误解数据结构。

答案 4 :(得分: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