SORU
10 EYLÜL 2009, PERŞEMBE


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
11 EYLÜL 2009, Cuma


Güncelleme:

Blogumda bu makaleler daha ayrıntılı olarak: yöntem arasındaki farkı açıklar

< / ^ 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)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ownage Pranks

    Ownage Prank

    13 AĞUSTOS 2007
  • PlayStation

    PlayStation

    16 Aralık 2005
  • Warner Bros. UK

    Warner Bros.

    6 HAZİRAN 2008