SQL सर्वर के साथ INNER जॉइन का उपयोग करके हटाएं कैसे?
sql-server sql-server-2008 (10)
SQL सर्वर प्रबंधन स्टूडियो में मैं आसानी से एक चयन क्वेरी बना सकता हूं।
SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
मैं इसे निष्पादित कर सकता हूं, और मेरे सभी संपर्क दिखाए जाते हैं।
अब चयन को एक हटाएं में बदलें:
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
मैं SQL Server 2008
में INNER JOIN
का उपयोग करके हटाना चाहता हूं।
लेकिन मुझे यह त्रुटि मिलती है,
संदेश 156, स्तर 15, राज्य 1, रेखा 15
कीवर्ड 'INNER' के पास ncorrect वाक्यविन्यास।
मेरा कोड:
DELETE FROM WorkRecord2
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
आप 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;
@Devart का उत्तर भी मानक एसक्यूएल है हालांकि अधूरा, इस तरह दिखना चाहिए:
DELETE
FROM WorkRecord2
WHERE EXISTS ( SELECT *
FROM Employee S
WHERE S.EmployeeNo = WorkRecord2.EmployeeRun
AND Company = '1'
AND Date = '2013-05-06' );
उपरोक्त के बारे में ध्यान देने योग्य महत्वपूर्ण बात यह है कि यह हटा है कि डिलीट एक ही तालिका को लक्षित कर रहा है, जैसा कि दूसरे उदाहरण में स्केलर सबक्वायरी की आवश्यकता होती है।
मेरे लिए विभिन्न स्वामित्व वाक्यविन्यास उत्तरों पढ़ने और समझने के लिए कठिन हैं। मुझे लगता है कि @frans eilering द्वारा उत्तर में दिमाग का सबसे अच्छा वर्णन किया गया है यानी कोड लिखने वाले व्यक्ति को उस व्यक्ति की परवाह नहीं है जो कोड को पढ़ और बनाए रखेगा।
इस क्वेरी को आज़माएं:
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';
इसे आज़माएं, इससे मदद मिल सकती है
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';
जहां आप रिकॉर्ड्स को हटाना चाहते हैं, वहां FROM
DELETE
और FROM
बीच तालिका का नाम बस जोड़ें क्योंकि हमें हटाने के लिए तालिका निर्दिष्ट करनी है। खंड ORDER BY
भी हटाएं क्योंकि रिकॉर्ड हटाने के दौरान आदेश देने के लिए कुछ भी नहीं है।
तो आपकी अंतिम क्वेरी इस तरह होनी चाहिए:
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';
यह आपके लिए उपयोगी हो सकता है -
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 ....
)
यह होना चाहिए:
DELETE zpost
FROM zpost
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"
यहां मेरा 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)
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
नोट: जब आप delete
चाहते हैं तो हम CTE
अंदर JOIN
उपयोग नहीं कर सकते हैं।
एक समय में दो टेबल से रिकॉर्ड हटाने के लिए यह एक साधारण क्वेरी है।
DELETE table1.* ,
table2.*
FROM table1
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'