SQL क्वेरी किसी अन्य तालिका में ID के साथ रिकॉर्ड खोजने के लिए


123

मेरे पास डेटाबेस में प्राथमिक कुंजी बांधने के साथ दो टेबल हैं और मैं उनके बीच एक असहमति सेट खोजने की इच्छा रखता हूं। उदाहरण के लिए,

  • Table1कॉलम ( ID, Name) और नमूना डेटा:(1 ,John), (2, Peter), (3, Mary)
  • Table2कॉलम ( ID, Address) और नमूना डेटा:(1, address2), (2, address2)

तो मैं एक SQL क्वेरी कैसे बनाऊं ताकि मैं table1उस आईडी से पंक्ति ला सकूं जिसमें से नहीं है table2। इस मामले में, (3, Mary)वापस किया जाना चाहिए?

Ps। आईडी उन दो तालिकाओं के लिए प्राथमिक कुंजी है।

अग्रिम में धन्यवाद।


3
भविष्य के प्रश्नों के लिए एक टिप के रूप में: हमेशा परिभाषित करें कि आप किस डेटाबेस सिस्टम (और उस डेटाबेस का कौन सा संस्करण) का उपयोग कर रहे हैं। SQL सिर्फ संरचित क्वेरी भाषा है जो अधिकांश डेटाबेस सिस्टम द्वारा उपयोग की जाती है - जो वास्तव में बहुत मदद नहीं करती है ... अक्सर, डेटाबेस में ANSI / ISO SQL मानक से परे एक्सटेंशन और तरीके होते हैं जो समस्या को हल करना आसान बनाते हैं - लेकिन इसके लिए, आप हमें यह बताने की आवश्यकता है कि आप किस डेटाबेस का उपयोग कर रहे हैं
marc_s

5
@marc_s: क्या होगा यदि वे एक भाषा-अज्ञेय समाधान की तलाश में हैं, क्योंकि उन्हें कई अंतर्निहित डेटाबेस सिस्टम का समर्थन करने की आवश्यकता है, या डेटाबेस कार्यान्वयन दूर है?
dwanderson

हाय @marc_s, मैं इस मामले में PostgreSQL का उपयोग कर रहा हूं। याद दिलाने के लिए धन्यवाद।
जॉन्कली

जवाबों:


213

इसे इस्तेमाल करे

SELECT ID, Name 
FROM   Table1 
WHERE  ID NOT IN (SELECT ID FROM Table2)

8
@PrinceJea वास्तव में यह निर्भर करता है। स्पष्टीकरण के लिए यहां देखें
जॉन वू

जब मेरे पास 20 डेटा होते हैं, तो यह काम करता है, लेकिन जब मेरे पास 20000 डेटा होते हैं, तो यह काम नहीं करता है, Iam अब भ्रमित करता है।
फ्रैंक

1
नो आइडिया क्यों लेकिन यह काम नहीं कर रहा है। मेरे पास तालिका में लगभग 10000 पंक्तियाँ हैं। मेरे मामले में @JohnWoo समाधान ने ठीक काम किया।
मुनम यूसुफ

4
यह काम नहीं करेगा हम "वैल्यू इन" में बहुत अधिक मान नहीं लेंगे क्योंकि इस पद्धति में सीमित संख्या में सीएफ हैं: dba-oracle.com/t_maximum_number_of_sql_in_list_values.htm
G.Busato

2
मुझे इसे इस तरह से करना था: मैं तालिका 1 से चयन करता हूं जहां मैं नहीं हूं (तालिका 2 से जहां मैं अशक्त नहीं हूं) का चयन करें और मैं अशक्त नहीं
हूं

93

उपयोग LEFT JOIN

SELECT  a.*
FROM    table1 a
            LEFT JOIN table2 b
                on a.ID = b.ID
WHERE   b.id IS NULL

मुझे लगता है कि यह एक बहुत बड़े डेटाबेस के लिए तेज़ दृष्टिकोण है
एलेक्स जोलीग

12

वहाँ मूलतः कि करने के लिए 3 तरीके हैं: not exists, not inऔर left join / is null

बाईं तरफ के साथ है

SELECT  l.*
FROM    t_left l
LEFT JOIN
        t_right r
ON      r.value = l.value
WHERE   r.value IS NULL

अंदर नही

SELECT  l.*
FROM    t_left l
WHERE   l.value NOT IN
        (
        SELECT  value
        FROM    t_right r
        )

मौजूद नहीं

SELECT  l.*
FROM    t_left l
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    t_right r
        WHERE   r.value = l.value
        )

इनमे से कौन बेहतर है? इस प्रश्न का उत्तर प्रमुख विशिष्ट RDBMS विक्रेताओं के लिए तोड़ा जा सकता है। सामान्यतया, select ... where ... in (select...)जब उप-क्वेरी में रिकॉर्ड की संख्या का परिमाण अज्ञात होता है, तो इसका उपयोग करने से बचना चाहिए । कुछ विक्रेता आकार सीमित कर सकते हैं। उदाहरण के लिए, ओरेकल, एक है सीमा 1,000 है । सबसे अच्छी बात यह है कि तीनों को आज़माकर निष्पादन योजना को दिखाया जाए।

विशेष रूप से PostgreSQL, निष्पादन योजना के रूप NOT EXISTSऔर LEFT JOIN / IS NULLसमान हैं। मैं व्यक्तिगत रूप से NOT EXISTSविकल्प पसंद करता हूं क्योंकि यह इरादे को बेहतर दिखाता है। आखिरकार अर्थ यह है कि आप ए में रिकॉर्ड ढूंढना चाहते हैं कि बी में इसका पीके मौजूद नहीं है

पुराना लेकिन फिर भी सोना, पोस्टग्रैडक्यूएल के लिए विशिष्ट है, हालांकि: https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresl/


10

तेज वैकल्पिक

मैं ~ 2M पंक्तियों के साथ दो तालिकाओं का उपयोग करके कुछ परीक्षण (9.5 पर पोस्टग्रेज पर) चलाता था। नीचे दी गई यह क्वेरी प्रस्तावित किए गए अन्य प्रश्नों की तुलना में कम से कम 5 * बेहतर है:

-- Count
SELECT count(*) FROM (
    (SELECT id FROM table1) EXCEPT (SELECT id FROM table2)
) t1_not_in_t2;

-- Get full row
SELECT table1.* FROM (
    (SELECT id FROM table1) EXCEPT (SELECT id FROM table2)
) t1_not_in_t2 JOIN table1 ON t1_not_in_t2.id=table1.id;

1
यह @ वॉन वू के समाधान से तेज नहीं था। मैं Postgres 9.6 का उपयोग कर रहा हूं और Jhon के समाधान रनटाइम के बारे में 60ms है। जबकि मैं इस समाधान को 120 सेकंड के बाद और कोई परिणाम नहीं निकला।
froy001

5

@ जॉन वू की टिप्पणी / लिंक में दिए गए बिंदुओं को ध्यान में रखते हुए, यह है कि मैं आमतौर पर इसे कैसे संभालूंगा:

SELECT t1.ID, t1.Name 
FROM   Table1 t1
WHERE  NOT EXISTS (
    SELECT TOP 1 NULL
    FROM Table2 t2
    WHERE t1.ID = t2.ID
)

2
SELECT COUNT(ID) FROM tblA a
WHERE a.ID NOT IN (SELECT b.ID FROM tblB b)    --For count


SELECT ID FROM tblA a
WHERE a.ID NOT IN (SELECT b.ID FROM tblB b)    --For results
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.