2011-12-11 14 views
55

bu sorguyu yürütmek çalışıyorum:PostgreSQL 'DEĞİL İÇİNDE' ve alt sorgu

SELECT mac, creation_date 
FROM logs 
WHERE logs_type_id=11 
AND mac NOT IN (select consols.mac from consols) 

Ama hiçbir sonuç almak. Test ettim ve sözdiziminde yanlış bir şey olduğunu biliyorum. MySQL'de böyle bir sorgu mükemmel çalışıyor. tablosunda bulunmayan bir mac olduğundan emin olmak için bir satır ekledim, ancak yine de hiçbir sonuç vermiyor. DEĞİL İÇİNDE kullanırken

SELECT mac, creation_date 
FROM logs 
WHERE logs_type_id=11 
AND mac NOT IN (
    SELECT mac 
    FROM consols 
    WHERE mac IS NOT NULL -- add this 
) 
+4

'consols.mac' sütunu 'NULL' veya 'NOT NULL' mü? –

cevap

96

Eğer değerler hiçbirinin sağlamalıdır İÇİNDE DEĞİL kullanarak BOŞ bulunmaktadır. Ayrıca SOL kullanabilirsiniz

SELECT mac, creation_date 
FROM logs lo 
WHERE logs_type_id=11 
AND NOT EXISTS (
    SELECT * 
    FROM consols nx 
    WHERE nx.mac = lo.mac 
); 
+2

Not: 'In (...)' her zaman NULL'leri (ve çoğaltmaları) kaldırdığı için, alt sorguda 'WHERE mac NULL değil 'cümlesi gerekli değildir. Bir küme NULLs – wildplasser

+3

@wildplasser içeremediğinden, bunun hakkında bir şey bilmiyorum. Ben 'NEDEN DEĞİL' kadar bende çalışmıyordu. Yuvalanmış "SELECT", birkaç "NULLS" döndürüyordu ve bu, IN (SELECT ...) 'ü açıyordu. – robins35

+1

"NEDEN OLDUĞUNU" n neden işe yaradığını gösteren bir açıklama için çok teşekkür ederim. – mbarkhau

25

, ayrıca sessizce boş davalarına bakan hangi MEVCUT DEĞİLDİR düşünmelisiniz:

+1

Ayrıca 'NOT EXISTS' vs' ... IN IN ' – IcanDivideBy0

+1

@ IcanDivideBy0 kullanırken büyük bir performans kaybı dikkat edin. vakalar aynı sorgu planını oluştururlar. Test ettin mi? – wildplasser

6

KATILIN ve NULL koşul IS:

SELECT 
    mac, 
    creation_date 
FROM 
    logs 
    LEFT JOIN consols ON logs.mac = consols.mac 
WHERE 
    logs_type_id=11 
AND 
    consols.mac IS NULL; 

"mac" sütunlar üzerinde bir dizin performansını yükseltebilir.