किसी अन्य तालिका के आधार पर तालिका में सभी पंक्तियों को हटा दें


81

मैं इस प्रश्न को कभी याद नहीं रख सकता हूँ!

मैं तालिका 1 में सभी पंक्तियों को हटाना चाहता हूं जिनकी आईडी तालिका 2 में समान हैं।

इसलिए:

DELETE table1 t1
 WHERE t1.ID = t2.ID

मुझे पता है कि मैं WHERE ID IN (Select ID FROM table2) कर सकता हूं, लेकिन अगर संभव हो तो मैं एक JOIN का उपयोग करके यह क्वेरी करना चाहता हूं।


आप एक जॉइन क्यों करना चाहते हैं?
20

आप इस प्रश्न के साथ क्या करने की योजना बना रहे हैं: stackoverflow.com/questions/1590709/…
OMG Ponies

क्योंकि जोड़ अक्सर तेज होते हैं।
HLGEM

@ टस्टर शायद यह आईडी की एक अस्थायी तालिका है जिसे हटाए जाने की आवश्यकता है
स्टीफन मेसा

1
@HLGEM क्या आप कह रहे हैं कि क्वेरी ऑप्टिमाइज़र एक सरल "एक्स से हटाएं जहां XY IN (बार से फू का चयन करें)" के रूप में उपवास में शामिल होने के लिए स्मार्ट नहीं है? मैं आंतक भावना पर आशावादी पर भरोसा करूंगा।
tster

जवाबों:



88
DELETE t1 
FROM Table1 t1
JOIN Table2 t2 ON t1.ID = t2.ID;

मैं हमेशा डिलीट स्टेटमेंट में उपनाम का उपयोग करता हूं क्योंकि यह दुर्घटना को रोकता है

DELETE Table1 

कारण जब इसे चलाने से पहले पूरी क्वेरी को उजागर करने में विफल रहा।


5
"हमेशा उपनाम का उपयोग करें" टिप्पणी के लिए ज्यादातर अपवोटिंग। महान विचार।
रॉसकोवा

35

एएनएसआई SQL में डिलीट, AFAIK में जॉइन का उपयोग करने का कोई समाधान नहीं है।

DELETE FROM Table1
WHERE Table1.id IN (SELECT Table2.id FROM Table2)

बाद में संपादित करें

अन्य समाधान (कभी-कभी तेज प्रदर्शन):

DELETE FROM Table1
WHERE EXISTS( SELECT 1 FROM Table2 Where Table1.id = Table2.id)

उनका सवाल अंत में कहता है कि वह IN क्लॉज के बजाय जॉइन का इस्तेमाल करना चाहता है।
स्टीफन मेसा


4

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

DELETE Table1
FROM Table1 t1, Table2 t2
WHERE t1.ID = t2.ID;

या

DELETE Table1
FROM Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.ID;

3

मुझे लगता है कि अगर आपने यह कोशिश की तो आपको थोड़ा और प्रदर्शन मिल सकता है

DELETE FROM Table1
WHERE EXISTS (
  SELECT 1
  FROM Table2
  WHERE Table1.ID = Table2.ID
)

3

यह Table1मापदंड से मेल खाने वाली सभी पंक्तियों को हटा देगा :

DELETE Table1 
FROM Table2 
WHERE Table1.JoinColumn = Table2.JoinColumn And Table1.SomeStuff = 'SomeStuff'

2

यह लिंक उपयोगी पाया गया

वहां से नकल की गई

अक्सर, एक तालिका में मापदंड के आधार पर एक तालिका से कुछ रिकॉर्ड हटाना चाहता है। आप दोनों तालिका में रिकॉर्ड को हटाए बिना उन तालिकाओं में से एक को कैसे हटा सकते हैं?

DELETE DeletingFromTable
     FROM DeletingFromTable INNER JOIN CriteriaTable
     ON DeletingFromTable.field_id = CriteriaTable.id
     WHERE CriteriaTable.criteria = "value";

कुंजी यह है कि आप तालिका के नाम को सेलेक्ट के रूप में हटा सकते हैं । तो, जोइन और जहां चयन और सीमित करते हैं, जबकि DELETE डिलीट करता है। आप सिर्फ एक टेबल तक सीमित नहीं हैं, हालांकि। यदि आपके पास कई-से-कई संबंध हैं (उदाहरण के लिए, पत्रिका और सब्सक्राइबर, एक सदस्यता से जुड़े हुए) और आप एक सब्सक्राइबर को निकाल रहे हैं, तो आपको जॉइन मॉडल से किसी भी संभावित रिकॉर्ड को हटाने की आवश्यकता है।

 DELETE subscribers, subscriptions
     FROM subscribers INNER JOIN subscriptions 
       ON subscribers.id = subscriptions.subscriber_id
     INNER JOIN magazines 
       ON subscriptions.magazine_id = magazines.id
     WHERE subscribers.name='Wes';

किसी ज्वाइन के साथ रिकॉर्ड हटाना भी LEFT JOIN और WHERE के साथ किया जा सकता है यह देखने के लिए कि ज्वाइन टेबल NULL था या नहीं, ताकि आप एक ऐसे टेबल में रिकॉर्ड हटा सकें जिसमें मैच नहीं था (जैसे संबंध जोड़ने की तैयारी में। ) उदाहरण पोस्ट आने के लिए।


2

चूंकि ओपी एक विशिष्ट डीबी के लिए नहीं पूछता है, इसलिए मानक अनुपालन कथन का बेहतर उपयोग करें। MERGEलक्ष्य तालिका में कुछ जोड़ने के दौरान पंक्तियों को हटाने (या अपडेट) के लिए केवल SQL मानक में है।

merge table1 t1
    using (
        select t2.ID
            from table2 t2
    ) as d
    on t1.ID = d.ID
    when matched then delete;

MERGEएक कठोर शब्दार्थ है, कुछ त्रुटि मामलों से रक्षा करता है जो किसी का ध्यान नहीं जा सकता है DELETE ... FROM। यह मैच की 'विशिष्टता' को लागू करता है: यदि स्रोत में कई पंक्तियाँ (अंदर का कथन using) लक्ष्य में एक ही पंक्ति से मेल खाती हैं, तो मर्ज को रद्द किया जाना चाहिए और SQL इंजन द्वारा एक त्रुटि उठाई जानी चाहिए।


यह डिलीट-जॉइन कंस्ट्रक्शन से ज्यादा साफ है
asakura89


0

किसी अन्य तालिका के आधार पर तालिका रिकॉर्ड को हटाने के लिए

     Delete From Table1 a,Table2 b where a.id=b.id

    Or

      DELETE FROM Table1
    WHERE Table1.id IN (SELECT Table2.id FROM Table2)

  Or

        DELETE Table1
     FROM Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.ID;

0

यह पुराना है मुझे पता है, लेकिन इस गधे के संदर्भ का उपयोग करने वाले किसी व्यक्ति को सिर्फ एक संकेतक। मैंने अभी यह कोशिश की है और यदि आप Oracle का उपयोग कर रहे हैं, तो JOIN DELETE कथनों में काम नहीं करता है। आपको निम्न संदेश मिलता है:

ORA-00933: SQL कमांड ठीक से समाप्त नहीं हुई।


उदाहरण के लिए एक अन्य प्रश्न का यह उत्तर देखें कि ओरेकल के तहत जुड़ने के साथ डिलीट कैसे लिखें।
फ्रैडरिक

0

हालांकि, ओपी अंकुर गुप्ता के जवाब में 'इन' स्टेटमेंट का उपयोग नहीं करना चाहता है, लेकिन यह सबसे आसान तरीका था कि मैंने एक टेबल में रिकॉर्ड्स को डिलीट कर दिया जो एक टेबल में मौजूद नहीं था, एक से कई संबंधों में :

DELETE
FROM Table1 as t1
WHERE ID_Number NOT IN
(SELECT ID_Number FROM Table2 as t2)

मेरे लिए Access 2016 में एक आकर्षण की तरह काम किया।


0

मैं अक्सर निम्नलिखित निर्मित उदाहरण जैसी चीजें करता हूं। (यह उदाहरण लिनक्स पर चल रहे Informix SE का है।)

इस उदाहरण का उद्देश्य सभी अचल संपत्ति छूट / उन्मूलन लेनदेन रिकॉर्ड को हटाना है - क्योंकि abatement आवेदन में एक बग है - जो real_estate तालिका में जानकारी पर आधारित है।

इस मामले में last_update != nullइसका मतलब है कि खाता बंद नहीं है, और res_exempt != 'p'इसका मतलब है कि खाते व्यक्तिगत संपत्ति (वाणिज्यिक उपकरण / साज-सामान) नहीं हैं।

delete from trans 
where   yr = '16'
and     tran_date = '01/22/2016'
and     acct_type = 'r'
and     tran_type = 'a'
and     bill_no in
(select acct_no from real_estate where last_update is not null
 and res_exempt != 'p');

मुझे यह तरीका पसंद है, क्योंकि फ़िल्टरिंग मानदंड - कम से कम मेरे लिए - क्वेरी बनाते समय पढ़ना आसान है, और अब से कई महीनों को समझने के लिए जब मैं इसे देख रहा हूं और सोच रहा था कि मैं क्या सोच रहा था।


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