Hata

2013-04-18 11 views
10

Bu sorgu çalışır:Hata

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

ANCAK bu sorgu:

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) 

Bu sorgu da çalışır

SELECT s.sno FROM students s  
EXCEPT  
SELECT t.sno FROM take t WHERE t.cno = 'CS112'; 

hata ile başarısız:

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 

Burada yanlış olan ne yapıyorum?

cevap

14

MySQL'in sözdizimini EXCEPT desteklediğine inanmıyorum. NOT IN kullanmayı deneyin veya bir LEFT JOIN:

SELECT s.sno 
FROM students s  
WHERE s.sno NOT IN 
(
    SELECT t.sno 
    FROM take t 
    WHERE t.cno = 'CS112' 
); 

VEYA

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

GÜNCELLEME

ben gibi verilerinizi alay ve doğru 5 10 içinden döndürür:

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

Sen 'EXCEPT' desteklemeyen hakkında doğru. Ancak alternatifiniz doğru sonucu vermez. – Cratylus

+0

5-10 geri dönen sno arıyorsunuz, değil mi? – McCee

+0

Gönderdiğiniz sorgu, bunu döndürmez. – Cratylus

6

Sorgu:

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

Bu en iyi cevaptır, çünkü birden çok alanda çalışır –