在查询中使用except时出现语法错误

17

这个查询有效:

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 

我在这里做错了什么?
3个回答

23

我不相信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'

2
你关于不支持EXCEPT是正确的。然而,你提出的替代方案并不能产生正确的结果。 - Cratylus
1
您所发布的查询并未返回该结果。 - Cratylus
1
我模拟了你的数据,得到了5-10个返回结果。请查看修改后的答案。 - McCee

9

查询:

SQLFIDDLE示例

SELECT s.sno 
FROM students s
WHERE NOT EXISTS (SELECT 0 
                  FROM take t 
                  WHERE t.sno = s.sno 
                  AND t.cno = 'CS112') 

这是最好的答案,因为它适用于多个领域。 - Hossein Shahdoost

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接