2010-06-16 15 views
7

हटाना समझाने मूल रूप से मैं ऐसा करना चाहते हैं:कृपया इस शीर्ष 100 SQL सिंटैक्स

delete top(100) from table order by id asc 

लेकिन एमएस एसक्यूएल इस स्थिति

आम समाधान यह हो रहा है में आदेश अनुमति नहीं देता:

DELETE table WHERE id IN(SELECT TOP (100) id FROM table ORDER BY id asc) 

लेकिन मैं यह भी इस विधि here पाया:

delete table from (select top (100) * from table order by id asc) table 

जिसमें एक बेहतर अनुमानित निष्पादन योजना (74:26) है। दुर्भाग्य से मैं वास्तव में वाक्यविन्यास को समझ नहीं पा रहा हूं, कृपया कोई मुझे यह समझा सकता है?

हमेशा एक ही परिणाम प्राप्त करने के लिए किसी भी अन्य तरीकों में रुचि रखते हैं।

संपादित करें: मुझे अभी भी यह नहीं मिल रहा है मुझे डर है, मैं क्वेरी को पढ़ने में सक्षम होना चाहता हूं क्योंकि मैंने पहले दो को पढ़ा है जो व्यावहारिक रूप से अंग्रेजी हैं। मेरे लिए ऊपर प्रश्नों हैं:

delete the top 100 records from table, with the records ordered by id ascending 
delete the top 100 records from table where id is anyone of (this lot of ids) 
delete table from (this lot of records) table 

मैं नहीं बदल सकते तीसरे एक तार्किक अंग्रेजी वाक्य में से एक है ... मैं क्या मैं कैसे में इस मोड़ "तालिका से हटाना करता है पर पाने के लिए कोशिश कर रहा हूँ लगता है (इस रिकॉर्ड के बहुत सारे) "। 'से' एक अजीब स्थिति में प्रतीत होता है और 'टेबल' का दूसरा उल्लेख तार्किक रूप से अनिवार्य है (मेरे लिए)।

उत्तर

2

delete आदेश कई समान रूप होते हैं, के रूप में from कीवर्ड वैकल्पिक है, और विलोपन तालिका रिकॉर्ड का चयन क्वेरी से अलग निर्दिष्ट किया जा सकता:

delete table where ... 

delete from table where ... 

delete table from <query...> 

delete from table from <query...> 

पिछले दो लोगों के साथ विचार है कि है आप पहले परिभाषित कर सकते हैं कि कौन सी तालिका से हटाना है, फिर आप एक क्वेरी निर्दिष्ट कर सकते हैं जो रिकॉर्ड्स को हटाने के लिए चुनता है। क्वेरी अन्य तालिकाओं में शामिल हो सकती है, यही कारण है कि आपको अलग-अलग तालिका को हटाने के लिए अलग से परिभाषित करने की आवश्यकता होगी।

जो क्वेरी आपने पाया है उसे हटाने के लिए रिकॉर्ड्स चुनने के लिए केवल एक सबक्वायरी का उपयोग किया जाता है।

+0

मैं तीसरा उदाहरण जो "subtable मेज से तालिका हटाएँ" मेरे लिए पढ़ता के साथ अपने 4 वाक्यविन्यास में से एक से मेल नहीं कर सकते हैं। कृपया प्रश्न में मेरा संपादन देखें। – Patrick

+0

@ पैट्रिक: आप इसे अधिक से अधिक तार्किक रूप से पढ़ने के लिए वैकल्पिक 'से' अपनी क्वेरी (ऊपर तीसरे और चौथे रूप के बीच का अंतर) जोड़ सकते हैं। मैंने उपरोक्त रूपों को अधिक वर्णनात्मक बनाने के लिए समायोजित किया। – Guffa

+0

@ पैट्रिक: क्वेरी को अंग्रेजी में वर्णित किया जा सकता है "इसके रिकॉर्ड से मिलान करने वाले तालिका से सभी रिकॉर्ड हटाएं (इस तालिका के 'रिकॉर्ड्स' के बहुत सारे रिकॉर्ड)।" ध्यान दें कि क्वेरी में अंतिम "तालिका" उपनाम है, न कि तालिका का वास्तविक नाम। – Guffa

5

यह अच्छी तरह से here (एक दृश्य का उपयोग कर के बारे में लेख वार्ता लेकिन मुझे लगता है यही तर्क यदि आप एक बेहतर कार्य योजना लागू हो रही है आपकी क्वेरी के लिए आवेदन करना होगा) से समझाया गया है

पहले एक लिखा है "नष्ट कर दिया तालिका के भाग दो बार। एक बार हटाए जाने के लिए पंक्तियों को हटाने के लिए और फिर को पहचानने के लिए।

दूसरा यह टालता है।

संपादित करें यह वाक्यविन्यास के बारे में अधिक प्रश्न प्रतीत होता है। हटाने के लिए वाक्यविन्यास described here है।

प्रासंगिक सा है

DELETE 
    [ FROM ] 
    { <object> | rowset_function_limited 
    } 
    [ FROM <table_source> [ ,...n ] ] 

आपकी क्वेरी

delete alias 
from 
    (select top (100) * 
    from table 
    order by id asc) alias 

आप एक व्युत्पन्न तालिका का उपयोग कर रहे हैं ताकि FROM <table_source> की जरूरत है। आप पहले वैकल्पिक को छोड़ रहे हैं।

3

जो आप करना चाहते हैं वह नामक तकनीक है जिसे फास्ट ऑर्डर हटाया गया

निम्नलिखित ब्लॉग पोस्ट पर एक नज़र डालें: Performing Fast SQL Server Delete operations

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