ऐसी SQL पंक्तियों को हटा दें जहाँ ID का किसी अन्य तालिका से मेल नहीं है


160

मैं एक mysql तालिका में अनाथ प्रविष्टियों को हटाने की कोशिश कर रहा हूं।

मेरे पास इस तरह 2 टेबल हैं:

तालिका files:

| id | ....
------------
| 1  | ....
| 2  | ....
| 7  | ....
| 9  | ....

तालिका blob:

| fileid | ....
------------
| 1  | ....
| 2  | ....
| 3  | ....
| 4  | ....
| 4  | ....
| 4  | ....
| 9  | ....

fileidऔर idकॉलम टेबल एक साथ शामिल होने के लिए इस्तेमाल किया जा सकता।

मैं तालिका में सभी पंक्तियों को हटाना चाहता हूं blobजहां तालिका fileidनहीं मिल सकती है files.id

इसलिए उपरोक्त उदाहरण का उपयोग करना blobतालिका में पंक्तियों को हटा देगा: 3 और 4 (s) ।


1
यदि आप एस का उपयोग कर रहे हैं तो दूसरे उत्तर को छोड़ दें null
पचेरियर

जवाबों:


327

बाईं ओर का उपयोग करना / पूरा करना:

DELETE b FROM BLOB b 
  LEFT JOIN FILES f ON f.id = b.fileid 
      WHERE f.id IS NULL

उपयोग नहीं कर रहे हैं:

DELETE FROM BLOB 
 WHERE NOT EXISTS(SELECT NULL
                    FROM FILES f
                   WHERE f.id = fileid)

में प्रयोग नहीं:

DELETE FROM BLOB
 WHERE fileid NOT IN (SELECT f.id 
                        FROM FILES f)

चेतावनी

जब भी संभव हो, एक लेनदेन के भीतर DELETE प्रदर्शन करें (समर्थित माना - IE: MyISAM पर नहीं) ताकि आप समस्याओं के मामले में परिवर्तनों को वापस करने के लिए रोलबैक का उपयोग कर सकें।


12
जो, सामान्य रूप से, उपरोक्त में से सबसे तेज है?
हम्पस ब्रायोल्फ 18

2
किसी कारण के लिए, LEFT JOIN का उपयोग करने से हटना MS SQL Server Mgmt Studio पर काम नहीं करता (यकीन है कि क्यों? यह सिर्फ LEFT JOIN के बारे में शिकायत करता है)। किसी को पता है कि क्यों है? इसने हालांकि :)
अन्ना

5
FYI करें, यहाँ इन तीन तरीकों की सापेक्षिक क्षमता की एक उपयोगी चर्चा की गई है: explainextended.com/2009/09/18/…
moustachio

2
@ स्पेसर - "गलत" थोड़ा मजबूत है। यकीन है कि लोग समझ बनाने के लिए, जवाब कर काम करता है, तो fileidहै गैर-व्यर्थ । इसके अलावा, तीसरे समाधान ( NOT IN) में केवल f.idगैर-अशक्त होने की आवश्यकता होती है । संभवतः यह एक प्राथमिक कुंजी है, इसलिए यह होगा।
टूलमेकरस्टेव

2
इस w / SQLite का प्रयास करने वाले लोगों के लिए: इस उत्तर को
bunkerdive

26
DELETE FROM blob 
WHERE fileid NOT IN 
       (SELECT id 
        FROM files 
        WHERE id is NOT NULL/*This line is unlikely to be needed 
                               but using NOT IN...*/
      )

क्या है "/ * इस लाइन की आवश्यकता होने की संभावना नहीं है लेकिन Not IN ... * /" का उपयोग करने वाला है?
पचेरियर

1
@ स्पेसर - NOT IN (NULL)खाली परिणाम देता है ताकि NULL को बाहर करना पड़े। लेकिन एक idकॉलम शायद वैसे भी अशोभनीय नहीं होगा इसलिए "अपेक्षित होने की संभावना नहीं"
मार्टिन स्मिथ

वाह अच्छा कैच। तो omgponies द्वारा जवाब गलत है! not in(null)बहुत तार्किक है, यह काम क्यों नहीं करता है? उसके पीछे तर्क क्या है?
पचेरियर


1
@bunkerdive फिर डेटाबेस नाम में तीन भाग ऑब्जेक्ट नाम का उपयोग करें।
मार्टिन स्मिथ

17
DELETE FROM blob
WHERE NOT EXISTS (
    SELECT *
    FROM files
    WHERE id=blob.id
)

1
मुझे लगता है कि वहाँ एक files.idऔर blob.fileid। मैं अनुमान लगा रहा हूं कि आपकी क्वेरी में त्रुटि होगी।
jww

-8
delete from table1 t1 
    WHERE not exists (select id from table2 where related_field_in_t2=t1.id) 
    AND not exists (select id from table3 where related_field_in_t3=t1.id) 
    AND not exists (select id from table4 where related_field_t4=t1.id) 
    AND not exists (select id from table5 where related_field_t5=t1.id);

3
मैंने नीचे लिखा है क्योंकि: 1. यह उस संदर्भ में प्रश्न का उत्तर देने का प्रयास नहीं करता है जो पोस्ट किया गया था। 2. कोई स्पष्टीकरण नहीं है (और कोड-ओनली उत्तर स्टैकओवरफ़्लो पर कम-मूल्य हैं)। 3. NOT EXISTS9 साल पहले ही पोस्ट किया गया था। 4. आपने MySQL कीवर्ड के लिए ऑल-कैप्स का लगातार उपयोग करने के सर्वोत्तम अभ्यास को बढ़ावा नहीं दिया है। दूसरे शब्दों में, यहाँ कुछ भी रखने लायक नहीं है - यही कारण है कि मैंने भी इस पोस्ट को हटाने के लिए मतदान किया है।
मिकमैकुसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.