2013-04-18 5 views
10

このクエリは動作します:エラーが

mysql> SELECT t.sno FROM take t WHERE t.cno = 'CS112'; 
+------+ 
| sno | 
+------+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
+------+ 
4 rows in set (0.00 sec) 

しかし、このクエリ:

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) 

このクエリにも作品

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 

私はここで何が間違っていますか?

答えて

14

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' 
); 

OR

SELECT s.sno 
FROM students s  
    LEFT JOIN take t ON s.sno = t.sno 
WHERE IFNULL(t.cno, '') != 'CS112' 

UPDATE

私のようなあなたのデータを嘲笑し、それが正しく〜10 5を返します。

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'をサポートしていない権利についてです。あなたの代わりに、正しい結果が得られません。 – Cratylus

+0

あなたは戻ってきた5-10のsnoを探していますか? – McCee

+0

投稿したクエリはそれを返しません。 – Cratylus

6

問合せ:

SQLFIDDLEExample

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

これは複数のフィールドでも機能するので、これは最善の答えです –