PostgreSQL g NOT IN ’और उपकुंजी


89

मैं इस क्वेरी को निष्पादित करने का प्रयास कर रहा हूं:

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

लेकिन मुझे कोई परिणाम नहीं मिला। मैंने इसका परीक्षण किया, और मुझे पता है कि वाक्य रचना में कुछ गड़बड़ है। MySQL में ऐसी क्वेरी पूरी तरह से काम करती है। मैंने यह सुनिश्चित करने के लिए एक पंक्ति जोड़ी है कि कोई ऐसा है macजो consolsतालिका में मौजूद नहीं है , लेकिन फिर भी यह कोई परिणाम नहीं दे रहा है।


4
है consols.macस्तंभ NULLया NOT NULL?
मार्क बायर्स

जवाबों:


166

Not IN का उपयोग करते समय आपको यह सुनिश्चित करना चाहिए कि कोई भी मान NULL न हो:

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
नोट: WHERE mac IS NOT NULLउपखंड में खंड की जरूरत नहीं है, क्योंकि In(...)हमेशा NULLs (और डुप्लिकेट) को हटाता है। क्योंकि सेट में NULLs
Wildplasser

7
@wildplasser मैं उस के बारे में पता नहीं। यह मेरे लिए काम नहीं कर रहा था, जब तक कि मैंने जोड़ा नहीं IS NOT NULL। नेस्ट SELECTकुछ वापस कर रहा था NULLS, और वह ट्रिपिंग कर रहा था IN(SELECT...)
रोबिन्स 35

2
मैं बहुत समझाना चाहूंगा कि यह क्यों IS NOT NULLकाम करता है।
mbarkhau

7
ऐसा प्रतीत होता है कि NULLकिसी NOT INखंड में उपयोग करने से काम नहीं चलता क्योंकि तुलना NULLन तो सही है और न ही गलत। sqlbadpractices.com/using-not-in-operator-with-null-values
mbarkhau

2
is not nullयदि कोई मिलान मान और कम से कम एक मान उत्पन्न करता है तो क्वेरी अनुपस्थिति में कोई पंक्तियाँ नहीं लौटाएगी null। से खंड 9.22 "[...] अगर कोई बराबर दाएँ हाथ के मूल्यों और कम से कम एक दाएँ हाथ पंक्ति पैदावार अशक्त, अशक्त नहीं निर्माण में हो जाएगा का परिणाम है, सच नहीं: वर्तमान (संस्करण 10) PostgreSQL मैनुअल की । "
क्रिस्टोफर लुईस

29

Not IN का उपयोग करते समय, आपको NOT EXISTS पर भी विचार करना चाहिए, जो शून्य मामलों को चुपचाप संभालता है। PostgreSQL Wiki भी देखें

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

3
NOT EXISTSबनाम... NOT IN
IcanDivideBy0

1
@ IcanDivideBy0 ज्यादातर मामलों में वे एक ही क्वेरी योजना उत्पन्न करते हैं। क्या आपने इसका परीक्षण किया है?
Wildplasser

1
उप-मामलों के मामले में NOT EXISTS के बजाय NOT IN का उपयोग करने में प्रदर्शन लाभ भी है। Wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_NOT_IN
Gerbrand

8

आप एक LEFT JOIN और IS NULL कंडीशन का भी उपयोग कर सकते हैं:

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

"मैक" कॉलम पर एक सूचकांक प्रदर्शन में सुधार कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.