2008-12-15 9 views
226

मैं (MySQL में) के बाद दो एसक्यूएल टेबल मिल गया है:एसक्यूएल - एक मेज से रिकॉर्ड में मौजूद नहीं है लगता है एक और

Phone_book 
+----+------+--------------+ 
| id | name | phone_number | 
+----+------+--------------+ 
| 1 | John | 111111111111 | 
+----+------+--------------+ 
| 2 | Jane | 222222222222 | 
+----+------+--------------+ 

Call 
+----+------+--------------+ 
| id | date | phone_number | 
+----+------+--------------+ 
| 1 | 0945 | 111111111111 | 
+----+------+--------------+ 
| 2 | 0950 | 222222222222 | 
+----+------+--------------+ 
| 3 | 1045 | 333333333333 | 
+----+------+--------------+ 

मैं कैसे कॉल जिन लोगों के द्वारा किए गए थे जो बाहर मिल रहा है phone_numberPhone_book में नहीं है? वांछित आउटपुट होगा:

Call 
+----+------+--------------+ 
| id | date | phone_number | 
+----+------+--------------+ 
| 3 | 1045 | 333333333333 | 
+----+------+--------------+ 

किसी भी मदद की बहुत सराहना की जाएगी।

उत्तर

307

ऐसा करने के कई अलग अलग तरीकों,, दक्षता बदलती कितना अच्छा आपकी क्वेरी अनुकूलक है पर निर्भर करता है के साथ, और अपने दो तालिकाओं के सापेक्ष आकार है:

यह कम से कम बयान है, और अगर तेज हो सकता है आपके फोन बुक बहुत ही कम है:

SELECT * 
FROM Call 
WHERE phone_number NOT IN (SELECT phone_number FROM Phone_book) 

वैकल्पिक रूप से (धन्यवाद Alterlife को)

SELECT * 
FROM Call 
WHERE NOT EXISTS 
    (SELECT * 
    FROM Phone_book 
    WHERE Phone_book.phone_number = Call.phone_number) 

या (WOPR करने के लिए धन्यवाद)

SELECT * 
FROM Call 
LEFT OUTER JOIN Phone_Book 
    ON (Call.phone_number = Phone_book.phone_number) 
    WHERE Phone_book.phone_number IS NULL 

+1

में से बचने के लिए उपयोग मौजूद है - संकेत सवाल शीर्षक – annakata

+16

बाईं बाहरी में है शामिल होने शायद सामान्य मामले में सबसे तेज के रूप में यह बार-बार के निष्पादन को रोकता है सबक्वेरी। – WOPR

+0

नहीं चुनने की, लेकिन मेरे सुझाव पर सबक्वेरी रिटर्न select 'x' और नहीं select * Alterlife

17

कोड के नीचे थोड़ा और ऊपर प्रस्तुत जवाब से कुशल होगा (, कि अनदेखी के रूप में अन्य लोगों ने कहा, यह आम तौर पर सिर्फ कॉलम आप चाहते हैं, नहीं '*' का चयन करने के लिए सबसे अच्छा है) बड़े डेटासेट से निपटने पर।

SELECT * FROM Call WHERE 
NOT EXISTS (SELECT 'x' FROM Phone_book where 
Phone_book.phone_number = Call.phone_number) 
+1

हमेशा के रूप में, सर्वोत्तम प्रदर्शन के साथ एक चुनने के लिए अपने लक्षित डेटासेट के विरुद्ध प्रश्नों के प्रदर्शन को प्रोफाइल करने के लायक है। एसक्यूएल अनुकूलक इन दिनों काफी अच्छे हैं कि प्रदर्शन के परिणाम अक्सर आश्चर्यजनक होते हैं। –

59
SELECT Call.ID, Call.date, Call.phone_number 
FROM Call 
LEFT OUTER JOIN Phone_Book 
    ON (Call.phone_number=Phone_book.phone_number) 
    WHERE Phone_book.phone_number IS NULL 

सबक्वेरी को दूर करना चाहिए, क्वेरी अनुकूलक अपना जादू काम करने के लिए अनुमति देता है।

इसके अलावा, "चयन *" से बचें क्योंकि अगर कोई अंतर्निहित तालिकाओं या विचारों को बदलता है (और यह अक्षम है) तो यह आपके कोड को तोड़ सकता है।

+6

यह आम तौर पर सबसे प्रभावी तरीका है क्योंकि यह दूसरी तालिका पर एकाधिक पास नहीं करता है ... उम्मीद है कि कुछ लोग धूमकेतु पढ़ रहे हैं। – Nerdfest

+2

मैं उम्मीद करता हूं कि लोग प्रोफ़ाइल: जब तक कि आप एक शीर्ष एसक्यूएल प्रदर्शन गुरु नहीं हैं, पहले से ही बताएं कि सबसे तेज़ क्या होगा (और आपके द्वारा उपयोग किए जाने वाले डीबीएमएस इंजन पर निर्भर करता है)। – bortzmeyer

+1

बिग ओ नोटेशन आपको आसानी से बताएगा कि आप इस मामले में सबसे तेज़ी से क्या उम्मीद कर सकते हैं। यह परिमाण के आदेश अलग है। – Jonesopolis

4

मुझे लगता है कि

SELECT CALL.* FROM CALL LEFT JOIN Phone_book ON 
CALL.id = Phone_book.id WHERE Phone_book.name IS NULL 
+0

'कॉल' तालिका में' id' कॉलम 'फ़ोन_बुक' तालिका में 'id' कॉलम जैसा ही मान नहीं है, इसलिए आप इन मानों पर शामिल नहीं हो सकते हैं। एक समान दृष्टिकोण के लिए डब्ल्यूओपीआर का जवाब देखें। –

3
SELECT DISTINCT Call.id 
FROM Call 
LEFT OUTER JOIN Phone_book USING (id) 
WHERE Phone_book.id IS NULL 

यह आपके Phone_book तालिका में अतिरिक्त आईडी-s कि याद कर रहे हैं वापस आ जाएगी।

1
SELECT t1.ColumnID, 
CASE 
    WHEN NOT EXISTS(SELECT t2.FieldText 
        FROM Table t2 
        WHERE t2.ColumnID = t1.ColumnID) 
    THEN t1.FieldText 
    ELSE t2.FieldText 
END FieldText  
FROM Table1 t1, Table2 t2 
+0

यदि डेटा एक ही कॉलम –

+0

के लिए किसी अन्य तालिका में मौजूद नहीं है, तो यह आपको एक तालिका से डेटा वापस कर देगा यदि आप यह हल करने के बारे में कुछ स्पष्टीकरण भी जोड़ सकते हैं? –

1
SELECT name, phone_number FROM Call a 
WHERE a.phone_number NOT IN (SELECT b.phone_number FROM Phone_book b) 
+0

यह प्रश्न का उत्तर नहीं प्रदान करता है। किसी लेखक से स्पष्टीकरण की आलोचना या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/10501884) –

+0

@DennisKriechel अद्यतन क्वेरी ताकि यह प्रश्न के लिए अधिक विशिष्ट हो। – JoshYates1980

0

वैकल्पिक रूप से,

select id from call 
minus 
select id from phone_number 
+1

यह सुनिश्चित नहीं है कि यह प्रश्न का उत्तर देता है (हालांकि MINUS) ऑपरेटर एक नया जोड़ा है। यह निम्न गुणवत्ता कतार में समाप्त हुआ - आप इस उत्तर को बढ़ाने के लिए पसंद कर सकते हैं। –

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