2017-09-07 49 views
6

का कारण बनता है हाल ही में मुझे एक ऐसी स्थिति थी जहां मुझे किसी तालिका से कुछ पंक्तियां हटाने और स्तंभ नाम गलत वर्तनी की आवश्यकता होती थी। कोई त्रुटि नहीं फेंक दी गई और तालिका से सभी पंक्तियां हटा दी गईं। यहां एक ऐसी स्क्रिप्ट है जो इस मुद्दे को पुन: उत्पन्न करती है।कहां (चयन नॉनएक्सस्टिंग कॉलमनाम) अप्रत्याशित व्यवहार

ऑर्डर आईडी के साथ चार ऑर्डर के साथ ऑर्डर टेबल है। एक आइटम आईडी के साथ एक LIST_TO_DELETE तालिका है।

मैं का इस्तेमाल किया है चाहिए

DELETE TOP(1) FROM #Orders WHERE OrderID IN (SELECT ItemID FROM #LIST_TO_DELETE ) 

बजाय मैं

DELETE TOP(1) FROM #Orders WHERE OrderID IN (SELECT OrderID FROM #LIST_TO_DELETE ) 

इस्तेमाल किया यह #orders तालिका में सभी पंक्तियों के कारण होता है जब मैं केवल एक को नष्ट करने के लिए होती हटाए जाने के लिए।

CREATE TABLE #Orders (OrderID INT, OrderName VARCHAR(100)) 
INSERT INTO #Orders(OrderID, OrderName) VALUES (1,'Order One'),(2,'Order Two'),(3,'Order Three'), (4,'Order Four') 

CREATE TABLE #LIST_TO_DELETE (ItemID INT);INSERT INTO #LIST_TO_DELETE(ItemID) VALUES (1) 

DECLARE @rowcount INT = 1 
WHILE @rowcount > 0 
BEGIN 
    DELETE TOP(1) FROM #Orders WHERE OrderID IN (SELECT OrderID FROM #LIST_TO_DELETE ) 
    SET @rowcount = @@rowcount 
END 

SELECT * FROM #Orders 

DROP TABLE #Orders 
DROP TABLE #LIST_TO_DELETE 

अपने मूल कोड में, आदेश तालिका वास्तविक था और LIST_TO_DELETE एक मेज चर था, लेकिन इससे कोई फर्क नहीं क्या तालिका प्रकार प्रयोग किया जाता है बनाने के लिए लगता है। अगर मैं OrderID या ItemID से अलग किसी भी कॉलम नाम का उपयोग करें, मैं एक त्रुटि

DELETE TOP(1) FROM #Orders WHERE OrderID IN (SELECT OtherID FROM #LIST_TO_DELETE ) 
Invalid column name 'OtherID' 

इस कोड को इस तरह से व्यवहार करते हैं क्यों मिलता है?

उत्तर

4

में मौजूद नहीं है लेख पढ़ें:

निम्नलिखित बयान, फिर भी, एक त्रुटि फेंक होगा यह समझने के लिए कि क्या हो रहा है: Qualifying Column Names in Subqueries

The general rule is that column names in a statement are implicitly qualified by the table referenced in the FROM clause at the same level. If a column does not exist in the table referenced in the FROM clause of a subquery, it is implicitly qualified by the table referenced in the FROM clause of the outer query.

5

यह एक ज्ञात मुद्दा है।

निम्नलिखित बयान होगा ग़लती से deleteसभी उपयोगकर्ताओं मेज से पंक्तियों:

DELETE FROM users WHERE user_id IN (SELECT user_id FROM groups); 

भले ही समूह तालिका एक स्तंभ नामित user_id जरूरत नहीं है।

DELETE FROM users WHERE user_id IN (SELECT g.user_id FROM groups g); 

Msg 207, Level 16, State 1, Line 1 
Invalid column name user_id 

संपादित

DELETE TOP(1) FROM #Orders WHERE OrderID IN (SELECT OtherID FROM #LIST_TO_DELETE ) 
Invalid column name 'OtherID' 

यह एक त्रुटि फेंकता है, क्योंकि OtherID#Orders

+2

मुझे विश्वास नहीं है कि मुझे इसका सामना करना पड़ा है, लेकिन मुझे लगता है कि उपनाम के बिना, SQL सर्वर सोचता है कि उपयोगकर्ता आईडी उपयोगकर्ता तालिका से आता है। एक आसान परीक्षण एक स्तंभ नाम का उपयोग करना होगा जो किसी भी तालिका में मौजूद नहीं है और देखें कि क्या होता है। –

+0

इससे एक त्रुटि फेंक जाएगी। आप एसक्यूएल के बारे में सही मानते हैं कि user_id उपयोगकर्ता तालिका – Raj

+0

@Raj से आता है क्या आपके पास एमएसडीएन या किसी भी माइक्रोसॉफ्ट पेज का लिंक है जहां इस समस्या का वर्णन किया गया है? – Don

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