4

我有一个数据结构,其中学生和组具有多对多关系。我有三张桌子

学生:身份证,姓名

组:ID,名称

学生组:学生ID,组ID

如何只选择不属于特定组的学生(例如 group.id = 1)?

我做了一些搜索并尝试使用子查询,但只得到一个空集......

select * from students where not exists (select students.* from students left join students_groups on students_groups.student_id = student.id where students_groups.group_id = 1);

我应该如何查询?提前谢谢!

编辑 好的,看来以下两个终于可以工作了...有人可以向我解释为什么我不需要加入表格就可以工作吗???

select * from students where not exists (select * from students_groups where students_groups.student_id = student.id and student_groups.group_id = 1);

select * from students where id not in (select student_id from students_groups where group_id = 1);
4

4 回答 4

10

使用 aNOT IN应该可以正常工作:

SELECT * FROM Students
WHERE Id NOT IN (
    SELECT Student_Id FROM Students_Groups
    WHERE Group_Id = 1)
于 2012-07-19T17:23:05.010 回答
3

编辑后的问题要求解释。

将 SQL 查询视为文本中的维恩图。每个子句要么定义一个内容圈,要么告诉您您感兴趣的完整重叠圈图的哪一部分。

select * from students where id not in (select student_id from students_groups where group_id = 1);

一圈是学生桌。一个圆圈是 student_groups 表,其中 group_id = 1。圆圈重叠,students.id 等于 student_groups.student_id。您想要学生表中不在重叠区域的部分。

您不需要连接这些表,因为您的结果集仅包含来自学生表的数据。您正在使用另一个表来限制该结果集,而不是为您的结果提供数据。

于 2012-07-19T17:41:51.197 回答
2

未经测试,但以下其中一项应该可以工作。您将不得不做一些事情explain,看看哪一个是最好的。

select * 
from students 
where not exists (select *
                  from students_groups 
                  where students_groups.student_id = student.id 
                  and students_groups.group_id = 1)

或者...

select * 
from students 
where id not in (select student_id
                  from students_groups 
                  where group_id = 1)

或者...

select students.id, students.name 
from students 
left outer join students_groups on students.id = students_groups.student_id
                                and students_groups.group_id = 1
where students_groups.student_id is null
group by students.id, students.name
于 2012-07-19T17:22:06.357 回答
2

你可以尝试这样的事情:

SELECT
    *
FROM
    students
WHERE
    id NOT IN
        ((SELECT 
            student_id
        FROM
            students_groups
        WHERE
            group_id = 1
        ))
于 2012-07-19T17:24:27.960 回答