SQL查询以选择在一个列中具有一个值但缺少另一个值的记录

时间:2018-08-05 23:16:53

标签: sql postgresql

我有一个包含两个表的数据库。一个拥有学生可以参加的课程的名称(class_id,class_desc),另一个拥有学生的信息(id,fname,lname,class_id)。我加入表格以通过加入class_id来获得谁在上什么课的花名册。如何获得参加“ cl_2055”课程但不参加“ cl_6910”课程的学生名册?

2 个答案:

答案 0 :(得分:1)

如果可以的话,您确实需要更改架构。您应该有三个表。 Student,Class和StudentClass,(StudentClass包含指向其他每个表的指针。

但是,如果您坚持使用架构,那么...

SELECT
    *
FROM
    students 
WHERE
    class_id = 'cl_2055'
    AND id NOT IN (SELECT id FROM students where class_id = 'cl_6910')

这假设id不是唯一的,并且您使用ID来表示学生。如果使用ID表示记录,则需要第二种方法:

SELECT
    *
FROM
    students students_in_2055
WHERE
    class_id = 'cl_2055'
    AND NOT EXISTS (
        SELECT 1 
        FROM students students_in_6910 
        WHERE students_in_6910.class_id = 'cl_6910' 
           AND students_in_2055.fname = students_in_6910.fname
           AND students_in_2055.lname = students_in_6910.lname
    )

答案 1 :(得分:1)

我喜欢为此目的使用聚合

select si.fname, si.lname
from studentinformation si
where ci.classid in ('cl_2055', 'cl_6910')
group by si.fname, si.lname
having min(ci.classid) = 'cl_2055' and max(ci.classid) = 'cl_2055';

首先,这假设类标识符是id,而不是描述(对我来说似乎很合逻辑)。如果它们是描述,那么您需要加入课程信息。

这是如何工作的? where子句筛选出可能同时参加这两个课程的学生。 group by合计为每个学生单行。并且having保留仅位于“ cl_055”中的学生。