2012-10-11 13 views
5

त्रुटि के बजाय तालिका को साफ़ करता है मेरे पास SQL ​​का एक टुकड़ा है (जो आपको लगता है) संकलित नहीं करेगा, लेकिन इसके बजाय लक्ष्य तालिका से सभी पंक्तियों को हटा देता है।एसक्यूएल हटाएं

create table TableA (ColumnA varchar(200)); 
create table TableB (ColumnB varchar(200)); 

insert TableA values ('A'),('B'),('C'); 
insert TableB values ('A'); 

तो निम्नलिखित एसक्यूएल:

--Returns all rows from TableA 
select * from TableA; 

--Does not error (ColumnA does not exist on TableB) 
delete TableA where ColumnA in (select ColumnA from TableB) 

--No Rows are returned 
select * from TableA; 

हटाने बयान से ऊपर का कारण बनता है सभी पंक्तियों बल्कि erroring कि ColumnA में मौजूद नहीं है की तुलना में, TableA से निकाले जाने का

इस स्थापना पर विचार करें TableB

यहां एक एसक्यूएल फिडल इसे नियंत्रित कर रहा है: http://www.sqlfiddle.com/#!3/9d883/6

ऐसा लगता है कि ColumnATableA से उठाया जा रहा है, लेकिन उम्मीद है कि यह "दायरे से बाहर" होगा।

यह क्यों है?

उत्तर

4

कॉलम ए के बीच आंतरिक क्वेरी में सहसंबंध के कारण होने की अपेक्षा की जाती है।

यह आमतौर पर इस्तेमाल किया सहसंबद्ध क्वेरी प्रतिमान मान्य

DELETE TableA WHERE NOT EXISTS (select * from TableB where TableB.ID=TableA.ID) 

यह TableA प्रविष्टियों TableB में एक आश्रित रिकॉर्ड नहीं है दूर करता है।

यह दिखाता है कि आप एक सहसंबंधित क्वेरी में तालिकाए कॉलम का संदर्भ दे सकते हैं। आपकी क्वेरी

delete TableA where ColumnA in (select ColumnA from TableB) 

में आंतरिक क्वेरी TableB में प्रत्येक रिकॉर्ड के लिए

  • एक पंक्ति का उत्पादन प्रत्येक पंक्ति, जिसका मूल्य है Columna बाहरी क्वेरी से
  • एक स्तंभ

तो DELETE

3

के माध्यम से चला जाता है जबकि मैं भ्रम को समझता हूं, यह व्यवहार कर रहा है यह होना चाहिए। कॉलम ए अभी भी "दायरे में है"। वास्तव में यदि आप चाहें तो आप अपने सबक्वायरी में उसमें शामिल हो सकते हैं। ब्रैकेट स्कोप को सीमित नहीं करते हैं, लेकिन एक पठनीयता स्टैंडपॉइंट से मैं उस भ्रम को देख सकता हूं जो इसे बनाता है।

यह एक और उदाहरण है कि हमेशा अपने नाम के नाम तालिका तालिका (या उपनाम) के साथ उपसर्ग करना क्यों अच्छा विचार है।

+2

निश्चित रूप से टेबल नामों के साथ अपने कॉलम नामों को उपसर्ग न करें, वह आदमी जो कुछ बदसूरत स्कीमा होगा, लेकिन निश्चित रूप से Aliases का उपयोग करें ... – emalamisura

संबंधित मुद्दे