Синтаксическая ошибка при использовании except в запросе

#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:

Запрос:

SQLFIDDLEExample

 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;
 

http://www.sqlfiddle.com /#!2/a7430/7