SQL सर्वर के साथ INNER JOIN का उपयोग करके कैसे हटाएं?


1283

मैं का उपयोग कर नष्ट करना चाहते INNER JOINमें एसक्यूएल सर्वर 2008

लेकिन मुझे यह त्रुटि मिली:

संदेश 156, स्तर 15, राज्य 1, पंक्ति 15
कीवर्ड 'INNER' के पास गलत सिंटैक्स।

मेरा कोड:

DELETE FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'

2
प्रलेखन में उदाहरण C दिखाता है कि DELETEजुड़ने के साथ कैसे उपयोग किया जाए
Pondlife

1
उदाहरण C एक कर्सर और अतिरिक्त सामान का एक गुच्छा भी उपयोग करता है
२gu:

तालिका 1 से तालिका 1 से हटाएं। t1.id = t2.id पर तालिका 2 t2 इनर जॉइन करें; विवरण में youtu.be/_tyUVrS2iH4
अमरेश कुमार सिंह

जवाबों:


2241

आपको यह निर्दिष्ट करने की आवश्यकता है कि आप किस तालिका से हटा रहे हैं, यहां एक उपनाम के साथ एक संस्करण है:

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'

9
@bluefeet क्या आप दोनों तालिकाओं से हटाने के लिए SQL सर्वर के लिए सही सिंटैक्स प्रदान कर सकते हैं?
oabarca

44
@ user2070775 SQL सर्वर में 2 तालिकाओं से हटाने के लिए आपको 2 अलग-अलग कथनों का उपयोग करने की आवश्यकता है।
टैरिन

8
SQL Server में @ user2070775, आप लेन-देन और छद्म तालिकाओं का उपयोग कर सकते हैं, जैसा कि stackoverflow.com/questions/783726/…
मैथ्यू रोडिक

1
@MathieuRodic साझा करने के लिए धन्यवाद। अपने सेटअप में अगर मैं 2 टेबल से अलग से डिलीट करता हूं तो मुझे वास्तव में अब पता नहीं है कि कौन सी पंक्तियों को 2 टेबल से डिलीट करना है, तो इससे मदद मिलेगी :)
वेरना हाउंस्च्मिड

2
@ShahryarSaljoughi जो कि WorkRecord2 तालिका के लिए उपनाम है।
टैरिन

151

बस के बीच तालिका के नाम जोड़ने DELETEऔर FROMसे जहां क्योंकि हम नष्ट करने के लिए तालिका में बताने की रिकॉर्ड हटाना चाहते हैं। ORDER BYक्‍लॉज भी हटाएं क्‍योंकि रिकॉर्ड डिलीट करते समय ऑर्डर करने के लिए कुछ नहीं है।

तो आपकी अंतिम क्वेरी इस तरह होनी चाहिए:

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';

3
यदि आप केवल पहली तालिका से हटाने का इरादा रखते हैं तो यह SQL सर्वर पर काम करता है।
ट्रॉयसेवेन

1
@matwonk: यदि आप दूसरी तालिका के नाम का उपयोग करते हैं तो आप दूसरी तालिका से हटा सकते हैं। जैसे कि उपयोग करने DELETE Employeeसे टेबल के बजाय कर्मचारी की टेबल से डिलीट हो जाएगा WorkRecord2
hims056


30

संभव है कि यह आपके लिए उपयोगी हो -

DELETE FROM dbo.WorkRecord2 
WHERE EmployeeRun IN (
    SELECT e.EmployeeNo
    FROM dbo.Employee e
    WHERE ...
)

या यह कोशिश करो -

DELETE FROM dbo.WorkRecord2 
WHERE EXISTS(
    SELECT 1
    FROM dbo.Employee e
    WHERE EmployeeRun = e.EmployeeNo
        AND ....
)

1
यह एकमात्र उत्तर है जो Sql Server पर काम करता है। बस अपनी क्वेरी का निर्माण करें जैसे कि सेलेक्ट आईडी से ... ज्वाइन ... ज्वाइन करें आदि फिर इसे एक सबक्वेरी के रूप में लपेटें और एक टेबल से डिलीट करें (जहाँ) आईडी (सबक्वेरी) में
क्रिस मोसचिनी



11

यह संस्करण काम करना चाहिए

DELETE WorkRecord2
FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'

11

SQL सर्वर प्रबंधन स्टूडियो में मैं आसानी से एक SELECTक्वेरी बना सकता हूं ।

SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

मैं इसे निष्पादित कर सकता हूं, और मेरे सभी संपर्क दिखाए जाते हैं।

अब बदल SELECTएक करने के लिए DELETE:

DELETE Contact
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

आपके द्वारा SELECTस्टेटमेंट में देखे गए सभी रिकॉर्ड हटा दिए जाएंगे।

आप उदाहरण के लिए, एक ही प्रक्रिया के साथ एक अधिक कठिन आंतरिक जुड़ाव भी बना सकते हैं:

DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf


9

इस प्रश्न को आज़माएं:

DELETE WorkRecord2, Employee 
FROM WorkRecord2 
INNER JOIN Employee ON (tbl_name.EmployeeRun=tbl_name.EmployeeNo)
WHERE tbl_name.Company = '1' 
AND tbl_name.Date = '2013-05-06';

8
मुझे पूरा यकीन है कि एक DELETE केवल एक तालिका निर्दिष्ट कर सकती है। यह मेरे लिए काम नहीं करता है।
चुपके रब्बी

3
मेरा मानना ​​है कि आप mySQL में विलोपन के लिए कई तालिकाओं को निर्दिष्ट कर सकते हैं, लेकिन SQL सर्वर (जो सवाल पूछता है) पर नहीं।
dandev91

7

एक और तरीका है CTE

;WITH cte 
     AS (SELECT * 
         FROM   workrecord2 w 
         WHERE  EXISTS (SELECT 1 
                        FROM   employee e 
                        WHERE  employeerun = employeeno 
                               AND company = '1' 
                               AND date = '2013-05-06')) 
DELETE FROM cte 

नोट: जब आप चाहें तब हम JOINअंदर का उपयोग नहीं कर सकते ।CTEdelete


6

यह एक समय में दो तालिका से रिकॉर्ड को हटाने के लिए एक सरल क्वेरी है।

DELETE table1.* ,
       table2.* 
FROM table1 
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'

2
यह प्रश्न SQL सर्वर के लिए है। आप SQL सर्वर में एक बयान में दो तालिकाओं से नहीं हटा सकते। मेरी समझ यह है कि यह mysql और MS Access में किया जा सकता है।
डैरेन ग्रिफिथ

6

यह कोशिश करो, यह मदद कर सकता है

 DELETE WorkRecord2 
          FROM WorkRecord2 
    INNER JOIN Employee 
            ON EmployeeRun=EmployeeNo
         WHERE Company = '1' 
           AND Date = '2013-05-06';

7
यह स्वीकृत उत्तर से अलग कैसे है: stackoverflow.com/questions/16481379/… ?
डिफ़ॉल्ट लोकेल

3
यह उत्तर अलियासिंग के बजाय स्पष्ट तालिका नामकरण का उपयोग करता है, जिससे उन लोगों के लिए यह अनुभव करना आसान हो जाता है कि क्या हो रहा है।
जोशुआ बर्न्स 20

1
@JoshuaBurns: अभी भी मेरे उत्तर की सटीक नकल ।
hes056

4

यहाँ मेरा SQL सर्वर संस्करण है

DECLARE @ProfileId table(Id bigint)

DELETE FROM AspNetUsers
OUTPUT deleted.ProfileId INTO @ProfileId
WHERE Email = @email

DELETE FROM UserProfiles    
WHERE Id = (Select Id FROM @ProfileId)

4

आप के लिए तालिकाओं को निर्दिष्ट नहीं करते हैं Companyऔर Date, आप इसे ठीक करना चाह सकते हैं।

मानक एसक्यूएल का उपयोग MERGE:

MERGE WorkRecord2 T
   USING Employee S
      ON T.EmployeeRun = S.EmployeeNo
         AND Company = '1'
         AND Date = '2013-05-06'
WHEN MATCHED THEN DELETE;

@ डार्टार्ट का उत्तर भी मानक SQL है, हालांकि अधूरा है, इसे इस तरह देखना चाहिए:

DELETE 
  FROM WorkRecord2
  WHERE EXISTS ( SELECT *
                   FROM Employee S
                  WHERE S.EmployeeNo = WorkRecord2.EmployeeRun
                        AND Company = '1'
                        AND Date = '2013-05-06' );

उपरोक्त के बारे में ध्यान देने योग्य बात यह है कि यह स्पष्ट है कि हटाना एकल तालिका को लक्षित कर रहा है, जैसा कि दूसरे उदाहरण में लागू किया गया है, जो एक स्केलर सबक्वेरी की आवश्यकता है।

मेरे लिए विभिन्न मालिकाना वाक्यविन्यास उत्तर पढ़ना और समझना कठिन है। मुझे लगता है कि @frans को उत्तर देने में मानसिकता का सबसे अच्छा वर्णन किया गया है अर्थात कोड लिखने वाले व्यक्ति को उस व्यक्ति के बारे में कोई परवाह नहीं है जो कोड को पढ़ेगा और बनाए रखेगा।


4

यहां मैं वर्तमान में अद्यतन करने या हटाने के लिए उपयोग कर रहा हूं:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.