2011-12-11 14 views
55

मैं इस क्वेरी निष्पादित करने के लिए कोशिश कर रहा हूँ:PostgreSQL 'नहीं' और सबक्वेरी

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

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

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' कॉलम' न्यूल 'या' न्यूल 'है? –

उत्तर

96

जब नहीं का उपयोग करने में आप मूल्यों की कि कोई भी सुनिश्चित करना चाहिए शून्य कर रहे हैं।

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

नोट: उपरोक्त में 'जहां मैक नहीं है' खंड की आवश्यकता नहीं है, क्योंकि 'इन (...)' हमेशा NULLs (और डुप्लिकेट) को हटा देता है। चूंकि किसी सेट में NULLs – wildplasser

+3

@wildplasser I शामिल नहीं हो सकता है। यह मेरे लिए काम नहीं कर रहा था, जब तक कि मैंने 'नॉट नल' जोड़ा। नेस्टेड 'SELECT' कुछ 'NULLS' लौटा रहा था, और वह' IN (SELECT ...) 'को ट्रिप कर रहा था। – robins35

+1

मैं इस बारे में एक स्पष्टीकरण की सराहना करता हूं कि 'नॉट नल' क्यों काम करता है। – mbarkhau

25

जब नहीं का उपयोग कर, आप भी जो अशक्त मामलों चुपचाप हैंडल पर विचार करना चाहिए मौजूद नहीं है,:

+1

'EXISTS' बनाम' का उपयोग करते समय भी एक बड़ा प्रदर्शन हानि ध्यान दें ... नहीं – IcanDivideBy0

+1

@ IcanDivideBy0 सबसे अधिक में मामले वे एक ही प्रश्न योजना उत्पन्न करते हैं। क्या आपने इसका परीक्षण किया है? – wildplasser

6

तुम भी एक वाम इस्तेमाल कर सकते हैं शामिल हों और शून्य की स्थिति है:

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

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

संबंधित मुद्दे