MySQL EXCEPT эквивалент - PullRequest
       8

MySQL EXCEPT эквивалент

0 голосов
/ 27 августа 2018

Я ищу MySQL эквивалент или эквиваленты для следующего запроса:

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

где таблица разделов:

+-----------+--------+----------+------+----------+-------------+--------------+
| 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 года, но не в семестре весны 2010 года.

Ответы [ 4 ]

0 голосов
/ 27 августа 2018

Я люблю придерживаться 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
;
0 голосов
/ 27 августа 2018

MySQL не поддерживает except, поэтому просто используйте not exists или not 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, но я сомневаюсь, что это действительно необходимо.

0 голосов
/ 27 августа 2018

Я бы использовал 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
                 );
0 голосов
/ 27 августа 2018

используйте 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
...