2016-04-01 14 views
0

Ben ALL ile NOT operatörü kullanmaya çalışıyorum ama sql DEĞİL TÜM operatör ile

aşağıdaki izledi gerektiği gibi karşılaştırmak değildir:

+------+------+ 
| id | name | 
+------+------+ 
| 6 | a | 
| 7 | b | 
| 8 | c | 
| 9 | d | 
| 10 | e | 
+------+------+ 
5 rows in set (0.04 sec) 
:

tablex örneğin içeriyor

+------+------+ 
| id | name | 
+------+------+ 
| 4 | a | 
| 5 | b | 
| 7 | c | 
| 8 | d | 
+------+------+ 
4 rows in set (0.03 sec) 

i kullandım:

ve Tabley içeren

SELECT id, name FROM tablex WHERE NOT id < ALL (SELECT id FROM tabley); 

döner:

+------+------+ 
| id | name | 
+------+------+ 
| 6 | a | 
| 7 | b | 
| 8 | c | 
| 9 | d | 
| 10 | e | 
+------+------+ 
5 rows in set (0.00 sec) 

sorun, çözüm operatörü > kullanarak çok mantıklı, ama bunun sebebi nedir bazı durumlarda 'Tabley' göre daha düşük değerler döndürür olmasıdır ? Eğer id alt sorguda en küçükid daha küçük olduğundan emin olmak için, gibi

cevap

2

Eğer < operatörü kullanıyorsanız, öyle görünüyor. Yani SQL ifade etmek:

SELECT id, name FROM tablex WHERE NOT id < (SELECT min(id) FROM tabley) 

Alternatif olarak, olumsuzlama etrafında saygısız:

SELECT id, name FROM tablex WHERE id >= (SELECT min(id) FROM tabley) 
+0

Tamam, ama bir örnek: SELECT id, name FROM tablex WHERE NOT id < ANY (SELECT id FROM tabley); döner: +------+------+ | id | name | +------+------+ | 8 | c | | 9 | d | | 10 | e | +------+------+ 3 rows in set (0.11 sec) neden ile çalışır 'HERHANGİ' ama 'ALL' ile hayır? – nikomaster

+0

@nikomaster belki de bu, aşağıdakileri göstermeye yardımcı olabilir: http://stackoverflow.com/a/2298576/139010 –

+0

Ve bu: _ "Karşılaştırma operatörü tarafından takip edilmesi gereken" ALL "sözcüğü, karşılaştırma" TRUE "değerini döndürür alt sorgusunun döndürdüğü sütundaki değerlerin tümü için 'TRUE' olur. ”" _ http://dev.mysql.com/doc/refman/5.7/en/all-subqueries.html –