Sql Server 2008 का उपयोग करके तालिका से शीर्ष 1000 पंक्तियों को कैसे हटाया जाए?


108

मेरे पास SQL ​​Server में एक टेबल है। मैं इसमें से शीर्ष 1000 पंक्तियों को हटाना चाहूंगा। हालाँकि, मैंने यह कोशिश की, लेकिन मैंने शीर्ष 1000 पंक्तियों को हटाने के बजाय इसे तालिका की सभी पंक्तियों को हटा दिया।

यहाँ कोड है:

delete from [mytab] 
select top 1000 
a1,a2,a3
from [mytab]

8
आपको TOP सार्थक बनाने के लिए ORDER BY की आवश्यकता है: @Martin Smith का उत्तर देखें जो यह करने वाले पाँच में से केवल एक है। मुझे कभी
gbn

2
क्या आप कोई 1000 पंक्तियाँ हटाना चाहते हैं? बस बेतरतीब ढंग से चयनित? या, उदाहरण के लिए, शीर्ष 1000 सबसे पुरानी पंक्तियाँ?
निक चामास

13
आपने सभी तालिका को हटा दिया है क्योंकि delete from [mytab]एक कथन है, और select top ...दूसरा है।
निक चामास

2
आपको शीर्ष के लिए आदेश देने की आवश्यकता नहीं है, यह निर्भर करता है कि आप TOP क्यों कर रहे हैं। यदि आपको 10 मिलियन पंक्तियों को हटाने की आवश्यकता है और 1 जीबी लॉग स्पेस उपलब्ध उपयोग को हटाएँ TOP (10000) से dbo.myTable (अपने चुनिंदा खंड के साथ) करें और तब तक इसे चलाते रहें जब तक हटाने के लिए और पंक्तियाँ न हों। इसकी मनमानी करने पर कौन परवाह करता है। सॉर्ट करना केवल क्वेरी को धीमा करता है।
तवानहरप

1
मुझे एहसास है कि यह एक प्राचीन प्रश्न है (एसओ वर्षों में) लेकिन मुझे लगता है कि यह महत्वपूर्ण है कि लोग @ जीबीएन की टिप्पणियों पर विचार करें । हालांकि उनकी टिप्पणी मेरी दी गई स्थिति पर लागू नहीं होती है (बिना लॉक मुद्दों के कारण रिकॉर्ड के ब्लॉक को हटाने की कोशिश की जा रही है, लेकिन वास्तव में उस क्रम के बारे में परवाह नहीं है जिसमें वे हटाए जाते हैं) वे आपकी स्थिति पर लागू होने की संभावना हो सकती हैं। नीचे दिए गए उत्तरों का आँख बंद करके उपयोग करने से पहले सुनिश्चित करें कि आप ORDER BY खंड शामिल नहीं करते हैं।
एंड्रयू स्टीट्ज

जवाबों:


196

आपके द्वारा कोड किया गया कोड वास्तव में दो कथन हैं। A DELETEद्वारा पीछा किया गया SELECT

आप के TOPरूप में क्या आदेश द्वारा परिभाषित नहीं है ।

एक विशिष्ट आदेश मानदंड के लिए सीटीई या इसी तरह की तालिका अभिव्यक्ति से हटाना सबसे कुशल तरीका है।

;WITH CTE AS
(
SELECT TOP 1000 *
FROM [mytab]
ORDER BY a1
)
DELETE FROM CTE

13
आप ऐसा क्यों नहीं कर रहे हैं DELETE TOP (1000) FROM table ORDER BY column, यह सोच रहे लोगों के लिए : "INSERT, UPDATE, MERGE, या DELETE के साथ उपयोग की जाने वाली शीर्ष अभिव्यक्ति में संदर्भित पंक्तियों को किसी भी क्रम में व्यवस्थित नहीं किया जाता है।"
निक चामास

3
@ मैगनस हाँ। हालांकि 2000 नहीं। 2000 में एक व्युत्पन्न तालिका का उपयोग करना संभव हो सकता है। मेरे पास परीक्षण करने के लिए कोई उदाहरण नहीं है।
मार्टिन स्मिथ


2
मैंने थोड़ा अलग तरीके से किया था (हालांकि मुझे लगता है कि सीटीई देखने के लिए अच्छे हो सकते हैं): DELETE T1 FROM (Select TOP 1000 * FROM [MYTAB] ORDER BY A1) T1;
अबेकस

4
@ लियम - सिर्फ इसलिए कि अगर सीटीई से पहले कोई पूर्व कथन है तो इसे अर्धविराम के साथ समाप्त करने की आवश्यकता है, इसलिए इसे WITHउन लोगों से पूर्व-शिकायत शिकायतों के सामने जोड़ देना जिन्होंने ऐसा नहीं किया है।
मार्टिन स्मिथ

86

Sql2005 + का उपयोग करने के लिए बेहतर हो सकता है:

DELETE TOP (1000)
FROM [MyTab]
WHERE YourConditions

Sql2000 के लिए:

DELETE FROM [MyTab]
WHERE YourIdField IN 
(
  SELECT TOP 1000 
    YourIdField 
  FROM [MyTab]
  WHERE YourConditions
)

परंतु

यदि आप मनमाने उपसमुच्चय के बजाय पंक्तियों के विशिष्ट उपसमुच्चय को हटाना चाहते हैं , तो आपको उपशमन के लिए स्पष्ट रूप से आदेश देना चाहिए:

DELETE FROM [MyTab]
WHERE YourIdField IN 
(
  SELECT TOP 1000 
    YourIdField 
  FROM [MyTab]
  WHERE YourConditions
  ORDER BY ExplicitSortOrder
)

धन्यवाद tp @gb का उल्लेख करने और अधिक स्पष्ट और सटीक उत्तर देने की मांग के लिए।


3
@ आपके लिए शायद बेकार है, लेकिन फिर भी यह वही है जो सवाल पूछ रहा है।
जोआचिम इस्कासन

1
@Joachim Isaksson: टॉप के बारे में जाना और पढ़ना फिर वापस आना। सेट में ORDER BY के बिना TOP जैसी कोई चीज नहीं है। वैकल्पिक रूप से, जाओ और मुझे एक कैनोनिकल संदर्भ ढूंढो जो मुझे गलत साबित करता है ... आपको खोजने के लिए सहेजने के लिए, sqlblog.com/blogs/alexander_kuznetsov/archive/2009/05/20/… और blogs.technet-
gbn

1
@ जीबी को हटाने के बारे में कोई भी स्थिति नहीं है, इसलिए उपनगरीय इलाके में ORDER BY बेकार है
ओलेग Dok

1
@ फिर क्या आपने उपकेंद्र में उल्लेख किया है - मैं चुना मानदंड के अंदर 1000 मनमानी पंक्तियों को फ़िल्टर करता हूं और फिर हटा देता हूं। वैध परिदृश्य? हाँ। अगर मैं NEWID द्वारा ORDER जोड़ता हूं (या जो कुछ भी नहीं बदलता है - मैं अभी भी चुना हुआ मानदंड द्वारा फ़िल्टर की गई 1000 पंक्तियों को हटा देता हूं
ओलेग डॉक

8
अगर आप बिना ORDER के TOP के एक वैध उपयोग के लिए देख रहे हैं, तो: क्या मुझे यहां लाया गया है, मुझे कुछ मापदंड से मेल खाती सभी पंक्तियों को हटाने की आवश्यकता है, लेकिन प्रदर्शन कारणों से, मैं नहीं चाहता कि यह 10,000 से अधिक पंक्तियों को हटाए। समय पर। मुझे परवाह नहीं है कि यह कौन सी पंक्तियों को हटाता है, क्योंकि मैं कमांड को कुछ अंतराल पर फिर से चलाऊंगा जब तक कि ऐसी सभी पंक्तियां नहीं चली जाती हैं।
रिचीबन


6
delete from [mytab]
where [mytab].primarykeyid in
(
select top 1000 primarykeyid
from [mytab]
)

4
बेकार: शीर्ष एक आदेश द्वारा बिना मनमानी पंक्तियाँ देता है
gbn

4
@ आपके लिए शायद बेकार है, लेकिन फिर भी यह वही है जो सवाल पूछ रहा है।
जोआचिम इस्कासन

3
@ लेकिन मैंने यह दावा नहीं किया कि कोई डिफ़ॉल्ट क्रम है या यह कि क्वेरी किसी भी तरह से उपयोगी है, मैंने आपको केवल यह याद दिलाया है कि प्रश्न एक के लिए नहीं पूछा गया था, तो आप क्या आदेश देने का सुझाव देंगे?
जोआचिम इस्कासन

2
@ मुझे नहीं पता कि आप हर किसी से इतनी दुश्मनी क्यों कर रहे हैं कि यह एक प्रारंभिक बिंदु है। मैं यह दावा नहीं करता कि मेरा उत्तर सभी का अंत है, यह केवल किसी को मदद करने के लिए एक सुझाव है। मुझे लगता है कि महत्व वह कुंजी है जो यहां उप क्वेरी से वापस आ रही है।
जेसन डैम

2
यह सब हो सकता है कि पूछने वाले की तलाश हो। मैं सिर्फ पढ़ने के लिए दूसरों को एक नोट जोड़ना चाहूंगा कि इस तरह के बयान से हटाए गए पंक्तियों को किसी भी क्रम में होने की गारंटी नहीं है।
निक चामास

3
SET ROWCOUNT 1000;

DELETE FROM [MyTable] WHERE .....

2
सिर्फ 1000 पंक्तियों के साथ काम करते समय, क्या यह वास्तव में मायने रखता है ?? यदि यह 100,000,000 पंक्तियाँ थीं, तो आपके अंक मान्य हो सकते हैं, लेकिन सिर्फ 1000 पंक्तियों के लिए, यह SQL 2008 के लिए अब तक प्रस्तावित सबसे सरल समाधान है।
जो बॉर्न

1

यह तेज़ है। कोशिश करो:

DELETE FROM YourTABLE
FROM (SELECT TOP XX PK FROM YourTABLE) tbl
WHERE YourTABLE.PK = tbl.PK

YourTABLEतालिका नाम से प्रतिस्थापित करें, XXउदाहरण के लिए 1000, pkआपकी तालिका के प्राथमिक कुंजी क्षेत्र का नाम है।


आप प्रभावी रूप से एक से दो तालिकाओं का निर्माण कर रहे हैं, और फिर जहां हटा दिया गया है। जब आप किसी तालिका से सबसे पुराने (या नवीनतम) रिकॉर्ड हटाना चाहते हैं तो यह अच्छी तरह से काम करता है, क्योंकि आप उन्हें पहले आरोही कर सकते हैं। यह t-sql Microsoft द्वारा स्वीकार किया जाता है (और यह तेज़ है)।
टकीला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.