SQL "sorgu" sonuç verir değil seçin
Yasal Uyarı: sorun (sanırım) buldum, ama bu konuda (kolay) hiçbir yerde bulamadım bu yana Yığın Taşması için eklemek istedim Ayrıca, birisi benden daha iyi bir cevap olabilir.
Bir "Ortak" diğer birkaç tablo tarafından başvurulan. tablo bir veritabanı var Ortak tablodaki kayıtları (yani, diğer tablolar herhangi bir başvuru vardı) artık ne olduğunu görmek istedim.
Bu sorgu koştu:
select *
from Common
where common_id not in (select common_id from Table1)
and common_id not in (select common_id from Table2)
Artık kayıtları olduğunu biliyorum, ama hiçbir kayıt iade edildi. Neden olmasın?
(Eğer bu kadar önemliyse SQL Server.)
CEVAP
Güncelleme:
Blogumda bu makaleler daha ayrıntılı olarak: yöntem arasındaki farkı açıklar
NOT IN
vs.NOT EXISTS
vs.LEFT JOIN / IS NULL
:SQL Server
NOT IN
vs.NOT EXISTS
vs.LEFT JOIN / IS NULL
:PostgreSQL
NOT IN
vs.NOT EXISTS
vs.LEFT JOIN / IS NULL
:Oracle
NOT IN
vs.NOT EXISTS
vs.LEFT JOIN / IS NULL
:MySQL
< / ^ hr .
Böyle bir sorgu yapmak için üç yolu vardır:
23**:
SELECT * FROM common LEFT JOIN table1 t1 ON t1.common_id = common.common_id WHERE t1.common_id IS NULL
NOT EXISTS
:SELECT * FROM common WHERE NOT EXISTS ( SELECT NULL FROM table1 t1 WHERE t1.common_id = common.common_id )
NOT IN
:SELECT * FROM common WHERE common_id NOT IN ( SELECT common_id FROM table1 t1 )
table1.common_id
null değil, tüm bu sorgular, anlamsal olarak aynı.
Ne zaman null, NOT IN
farklı, beri IN
(ve, bu nedenle, NOT IN
) dönüş NULL
zaman değeri eşleşmiyor bir şey bir listesini içeren bir NULL
.
Bu kafa karıştırıcı olabilir, ama eğer bunun için alternatif sözdizimi biz hatırlarsan daha belirgin hale gelebilir:
common_id = ANY
(
SELECT common_id
FROM table1 t1
)
Bu durum sonuç listesi içindeki tüm karşılaştırmalar boolean bir üründür. Tabii ki,* *36 tek bir değer tüm sonuç NULL
çok işler NULL
sonuç verir.
Biz asla olamaz değerlerden en az biri NULL
beri common_id
hiçbir şey eşit değil kesinlikle bu listeden söylüyorlar.
Biz bu veri varsayalım:
common
--
1
3
table1
--
NULL
1
2
LEFT JOIN / IS NULL
NOT EXISTS
3
, NOT IN
dönerhiçbir şeyher zaman FALSE
NULL
ya da değerlendireceğini beri).
Non-sütun null durumda MySQL
,, LEFT JOIN / IS NULL
ve NOT IN
biraz (birkaç yüzde) NOT EXISTS
daha verimli. Eğer sütun ise null, NOT EXISTS
en verimli (daha fazla).
Oracle
, üç sorgularını aynı planları (ANTI JOIN
) verim.
SQL Server
, 56* / NOT EXISTS
*içinde daha verimlidir LEFT JOIN / IS NULL
beri kendi doktoru tarafından ANTI JOIN
için optimize edilmiş olması.
PostgreSQL
, LEFT JOIN / IS NULL
NOT EXISTS
daha başarılı NOT IN
sine onlar optimize edilmiş bir Anti Join
, NOT IN
kullanan hashed subplan
(hatta bir düz subplan
sorgu çok büyük olduğu için karma)
Nasıl bir "" değil; SERİ ile ...
&; sorgu Select2 tanımsız hata" iç...
PostgreSQL: Nasıl "büyük / küçük ...
Mongodb ile sorgu nasıl "gibi&quo...
Çözmek için nasıl "Eklenti yürütm...