【问题标题】:Syntax error when using except in a query在查询中使用 except 时出现语法错误
【发布时间】:2013-04-12 02:56:48
【问题描述】:

这个查询有效:

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 

我在这里做错了什么?

【问题讨论】:

    标签: mysql sql select sql-except


    【解决方案1】:

    我不相信 MySQL 支持 EXCEPT 语法。尝试使用NOT INLEFT 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'
    

    【讨论】:

    • 你不支持EXCEPT是对的。您的替代方案虽然不会产生正确的结果。
    • 您发布的查询没有返回。
    • 我模拟了您的数据并返回了 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') 
    

    【讨论】:

    • 这是最好的答案,因为它也适用于多个领域
    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-14
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2016-06-13
      • 1970-01-01
      • 2014-11-03
      相关资源
      最近更新 更多