2009-11-11 17 views
17

इस क्वेरी मैं उपयोग कर रहा हूँ है:हटाएँ पंक्तियाँ एक के साथ एक एकल क्वेरी (SQL एक्सप्रेस 2005) का उपयोग जहां हालत

DELETE TB1.*, TB2.* 
    FROM TB1 
     INNER JOIN TB2 ON TB1.PersonID = TB2.PersonID 
    WHERE (TB1.PersonID)='2' 

यह एमएस एक्सेस में ठीक काम कर रहा है, लेकिन निकट त्रुटि (गलत वाक्य रचना हो रही है ','।) एसक्यूएल सर्वर एक्सप्रेस 2005 में।

इसे कैसे हल करें? कृपया मदद करे।

+2

यह अब एसक्यूएल सर्वर 2012 या 2014 के साथ संभव है? मेरे पास मेरी कक्षा प्रोजेक्ट के लिए टेबल का एक बहुत ही निर्मित सेट है, जिस पर एक ही समय में दोनों टेबलों पर रिक्त प्रतिबंधों को हटा दिया गया है। मैं एक और सवाल नहीं पूछना चाहता क्योंकि यह इस तरह का एक डुप्लिकेट होगा। – trysis

उत्तर

11

आप DELETE CASCADE FK का उपयोग क्यों नहीं करते?

17

SQL 2005 - या उस मामले के लिए किसी भी अन्य मानक एसक्यूएल में एक अभिव्यक्ति के साथ आप एकाधिक तालिकाओं से DELETE नहीं कर सकते हैं। Access यहां अपवाद है।

इस प्रभाव को पाने का सबसे अच्छा तरीका FOREIGN KEYS को ONDELETEtrigger के साथ तालिका के बीच निर्दिष्ट करना है।

+0

यही कारण है कि मुझे टेबल को अलग करने वाले अल्पविराम पर 'गलत वाक्यविन्यास त्रुटि' मिल रही है 'DELETE तालिका 1, तालिका 2' के पास गलत वाक्यविन्यास ','। – Rich

3

यह एक कथन में नहीं किया जा सकता है। आपको 2 कथन

DELETE FROM TB1 WHERE PersonID = '2'; 
DELETE FROM TB2 WHERE PersonID = '2'; 
2

जैसा कि मुझे पता है, आप इसे वाक्य में नहीं कर सकते हैं।

लेकिन आप एक संग्रहित प्रक्रिया का निर्माण कर सकते हैं जो लेन-देन में जो भी टेबल आप चाहते हैं, वह लगभग वही है।

1

मुझे नहीं लगता कि आप एक साथ कई टेबल से हटा सकते हैं (हालांकि मैं निश्चित नहीं हूं)।

हालांकि, मुझे लगता है कि आप इस प्रभाव को प्राप्त करने के लिए सबसे अच्छा होगा जो कैस्केड को हटा देता है। यदि आपने ऐसा किया है तो आप एक तालिका से रिकॉर्ड को हटाने में सक्षम होंगे और दूसरे में रिकॉर्ड स्वचालित रूप से हटा दिए जाएंगे।

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

cascading referential integrity constraints पर एमएसडीएन दस्तावेज़ देखें।

1

विवरण तालिकाओं के लिए विदेशी कुंजी निर्दिष्ट करें जो मास्टर की प्राथमिक कुंजी के संदर्भ में हैं और नियम = कैस्केड हटाएं सेट करें।

अब जब आप मास्टर टेबल से रिकॉर्ड हटाते हैं तो सभी अन्य विवरण तालिका रिकॉर्ड हटाने वाली पंक्तियों के आधार पर प्राथमिक कुंजी मान स्वचालित रूप से हटा दिया जाएगा।

तो उस स्थिति में मास्टर टेबल की एक एकल डिलीट क्वेरी मास्टर टेबल डेटा के साथ-साथ बाल तालिका डेटा को हटा सकती है।

0

आप निम्न की तरह कुछ का उपयोग कर सकते हैं:

DECLARE db_cursor CURSOR FOR 
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name IN ("TB2","TB1") -- use these databases 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @name 


WHILE @@FETCH_STATUS = 0 
BEGIN 

     DELETE FROM @name WHERE PersonID ='2' 

     FETCH NEXT FROM db_cursor INTO @name 
END 
-1
DELETE TB1, TB2 
    FROM customer_details 
     LEFT JOIN customer_booking on TB1.cust_id = TB2.fk_cust_id 
    WHERE TB1.cust_id = $id 
+0

एक सादा-अंग्रेजी स्पष्टीकरण चोट नहीं पहुंचाएगा। Http://stackoverflow.com/help/how-to-answer देखें – Jubobs

0
CREATE PROCEDURE sp_deleteUserDetails 
    @Email varchar(255) 
AS 
    declare @tempRegId as int 
    Delete UserRegistration where [email protected] 
    set @tempRegId = (select Id from UserRegistration where Email = @Email) 
    Delete UserProfile where [email protected] 

RETURN 0 
0

आप इस

DELETE t2 
    FROM TB1 t1 
     INNER JOIN TB2 t2 ON t1.PersonID = t2.PersonID 
    WHERE t1.PersonID = '2' 

की तरह शामिल हो सकते हैं लेकिन एलेक्स उल्लेख किया, एक बार में केवल एक।

आप मेज पर झरना बाधा की जरूरत है एक बार

-1

बिल्कुल करने की कोशिश करें कि इस प्रश्न के

DELETE TB1, TB2 FROM TB1 INNER JOIN TB2 
WHERE TB1.PersonID = TB2.PersonID and TB1.PersonID = '2' 
संबंधित मुद्दे