#mysql #sql #database
#mysql #sql #выберите #sql-except
Вопрос:
Этот запрос работает:
mysql> SELECT s.sno FROM students s;
------
| sno |
------
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
------
10 rows in set (0.00 sec)
Этот запрос также работает:
mysql> SELECT t.sno FROM take t WHERE t.cno = 'CS112';
------
| sno |
------
| 1 |
| 2 |
| 3 |
| 4 |
------
4 rows in set (0.00 sec)
НО этот запрос:
SELECT s.sno FROM students s
EXCEPT
SELECT t.sno FROM take t WHERE t.cno = 'CS112';
сбой с ошибкой:
mysql> SELECT s.sno FROM students s
-> EXCEPT
-> SELECT t.sno FROM take t WHERE t.cno = 'CS112';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use n
ear 'EXCEPT
SELECT t.sno FROM take t WHERE t.cno = 'CS112'' at line 2
Что я здесь делаю не так?
Ответ №1:
Я не верю, что MySQL поддерживает синтаксис EXCEPT. Попробуйте использовать NOT IN
или LEFT JOIN
:
SELECT s.sno
FROM students s
WHERE s.sno NOT IN
(
SELECT t.sno
FROM take t
WHERE t.cno = 'CS112'
);
или
SELECT s.sno
FROM students s
LEFT JOIN take t ON s.sno = t.sno
WHERE IFNULL(t.cno, '') != 'CS112'
Обновить
Я подделал ваши данные как таковые, и они правильно возвращают с 5 по 10:
create temporary table temp_students (sno int)
insert into temp_students values (1)
insert into temp_students values (2)
insert into temp_students values (3)
insert into temp_students values (4)
insert into temp_students values (5)
insert into temp_students values (6)
insert into temp_students values (7)
insert into temp_students values (8)
insert into temp_students values (9)
insert into temp_students values (10)
create temporary table temp_take (sno int, cno varchar(50))
insert into temp_take values (1, 'CS112')
insert into temp_take values (2, 'CS112')
insert into temp_take values (3, 'CS112')
insert into temp_take values (4, 'CS112')
SELECT s.sno
FROM temp_students s
LEFT JOIN temp_take t ON s.sno = t.sno
WHERE IFNULL(t.cno, '') != 'CS112'
Комментарии:
1. Вы правы в том, что не поддерживаете
EXCEPT
. Однако ваша альтернатива не дает правильного результата.2. Отправленный вами запрос не возвращает это.
3. Я подделал ваши данные и получил 5-10 возвращенных. См. Измененный ответ.
Ответ №2:
Запрос:
SELECT s.sno
FROM students s
WHERE NOT EXISTS (SELECT 0
FROM take t
WHERE t.sno = s.sno
AND t.cno = 'CS112')
Комментарии:
1. Это лучший ответ, поскольку он также работает с несколькими полями
Ответ №3:
Попробуйте это.
SELECT s.sno FROM students s
LEFT JOIN take t ON t.sno = s.sno AND t.cno = 'CS112'
WHERE t.sno IS NULL;