从不在另一个表中的表中选择记录

时间:2016-07-15 13:53:29

标签: mysql sql

我有两张桌子。

public void Decision(string Var, string Input)
{
    if (Var == "Name")
        Name = Input;
    else if (Var == "Nickname")
        Nickname = Input;
}

public void Decision(int Input)
{
    Age = input
}

我需要查询表格,以便它返回student_id和尚未学习的课程。结果应该是:

Course
course_id | name
------------------
1         | PROG
2         | ENGL
3         | SCIE

Enrollment List
ID | student_id | course_id | grade
-----------------------------------
1  | 445566     | 1         | 4.0
2  | 445566     | 2         | 2.0
3  | 778899     | 3         | 2.5

我尝试了查询

student_id | course_id
----------------------
445566     | 3
778899     | 1
778899     | 2

返回零记录。我该怎么做?

1 个答案:

答案 0 :(得分:3)

简单规则:从不FROM子句中使用逗号。 始终使用明确的JOIN语法。

无论如何,您需要以特定方式处理此问题。从所有学生和所有课程的列表开始。然后使用left joinnot exists过滤掉列表中不存在的内容:

SELECT s.student_id, c.name
FROM course c CROSS JOIN
     (SELECT DISTINCT student_id FROM list l) s
WHERE NOT EXISTS (SELECT 1
                  FROM list l2
                  WHERE c.course_id = l2.course_id and s.student_id = l2.student_id
                 )