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