MySQL 除了等效项

MySQL EXCEPT equivalent

我正在为以下查询寻找 MySQL 等价物或等价物:

(select course_id
from section
where semester = 'Fall' and year= 2009)
except
(select course_id
from section
where semester = 'Spring' and year= 2010);

第 table 部分是:

+-----------+--------+----------+------+----------+-------------+--------------+
| course_id | sec_id | semester | year | building | room_number | time_slot_id |
+-----------+--------+----------+------+----------+-------------+--------------+
| BIO-101   | 1      | Summer   | 2009 | Painter  | 514         | B            |
| BIO-301   | 1      | Summer   | 2010 | Painter  | 514         | A            |
| CS-101    | 1      | Fall     | 2009 | Packard  | 101         | H            |
| CS-101    | 1      | Spring   | 2010 | Packard  | 101         | F            |
| CS-190    | 1      | Spring   | 2009 | Taylor   | 3128        | E            |
| CS-190    | 2      | Spring   | 2009 | Taylor   | 3128        | A            |
| CS-315    | 1      | Spring   | 2010 | Watson   | 120         | D            |
| CS-319    | 1      | Spring   | 2010 | Watson   | 100         | B            |
| CS-319    | 2      | Spring   | 2010 | Taylor   | 3128        | C            |
| CS-347    | 1      | Fall     | 2009 | Taylor   | 3128        | A            |
| EE-181    | 1      | Spring   | 2009 | Taylor   | 3128        | C            |
| EE-302    | 1      | Summer   | 2010 | Watson   | 327         | C            |
| FIN-201   | 1      | Spring   | 2010 | Packard  | 101         | B            |
| HIS-351   | 1      | Spring   | 2010 | Painter  | 514         | C            |
| MU-199    | 1      | Spring   | 2010 | Packard  | 101         | D            |
| PHY-101   | 1      | Fall     | 2009 | Watson   | 100         | A            |
+-----------+--------+----------+------+----------+-------------+--------------+

换句话说,我想找到所有在 2009 年秋季学期而不是在 Spring 2010 学期教授的课程。

使用 not in 因为 except 在 mysql

中不可用
select *
from section 
where courseid not in 
(
select courseid
from section
where semester = 'Spring' and year= 2010
) and semester = 'Fall' and year = 2009

MySQL不支持except,所以只用not existsnot in:

select courseid
from section sf
where semester = 'Fall' and year = 2009 and not exists
      (select 1
       from section ss
       where sf.courseid = ss.courseid and ss.semester = 'Spring' and ss.year = 2010
      );

(我更喜欢 not exists 因为它对 NULL 值有更直观的支持。)

这不准确,因为 except 删除了重复项。您可以使用select distinct,但我怀疑是否真的需要。

我会使用 not exists :

select s.*
from section s
where semester = 'Fall' and year = 2009 and
      not exists (select 1 
                  from section s1
                  where s.course_id = s1.course_id and 
                        s1.semester = 'Spring' and s1.year = 2010
                 );

我喜欢在可能的情况下坚持使用 JOIN,在这里也确实可行。

SELECT sFa.course_id
FROM section AS sFa
LEFT JOIN section AS sSpr 
   ON sFa.course_id = sSpr.course_id
   AND sSpr.semester = 'Spring' AND sSpr.year= 2010
WHERE sFa.semester = 'Fall' 
   AND sFa.year= 2009
   AND sSpr.course_id IS NULL
;
SELECT DISTINCT s.course_id FROM section s
WHERE s.course_id IN ( 
 SELECT x.course_id FROM section x WHERE 
 x.semester="Fall" AND 
 x.year=2009 AND 
 x.semester<>"Spring" AND
 x.year<>2010
 );