এসকিএল সার্ভার ২০০৮ ব্যবহার করে টেবিল থেকে শীর্ষস্থানীয় 1000 সারিগুলি কীভাবে মুছবেন?


108

আমার এসকিউএল সার্ভারে একটি টেবিল রয়েছে। আমি এটি থেকে শীর্ষ 1000 সারি মুছে ফেলতে চাই। যাইহোক, আমি এটি চেষ্টা করেছিলাম, তবে আমি কেবল শীর্ষস্থানীয় 1000 টি সারি মুছে ফেলার পরিবর্তে এটি সারণির সমস্ত সারি মুছে ফেলেছি।

কোডটি এখানে:

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

8
শীর্ষস্থানীয় অর্থবহ করে তোলার জন্য আপনার একটি অর্ডার দরকার: দেখুন @ মার্টিন স্মিথের উত্তর যা এই পাঁচটির মধ্যে একমাত্র এটি। আমি মাঝে মাঝে হতাশ হই
gbn

2
আপনি কি কোনও 1000 সারি মুছতে চান ? শুধু এলোমেলোভাবে নির্বাচিত? অথবা, উদাহরণস্বরূপ, শীর্ষস্থানীয় 1000 পুরানো সারিগুলি?
নিক চ্যামাস

13
আপনি সমস্ত টেবিল মুছে ফেলেছেন কারণ delete from [mytab]একটি বিবৃতি, এবং select top ...অন্যটি।
নিক চাম্মাস

2
আপনাকে শীর্ষের জন্য অর্ডার দেওয়ার দরকার নেই, আপনি কেন টপ করছেন তা নির্ভর করে। আপনার যদি 10 মিলিয়ন সারি অপসারণ করতে হয় এবং 1 গিগাবাইট লগ স্পেস উপলভ্য থাকে তবে dbo.myTable (আপনার নির্বাচিত ধারা সহ) থেকে TOP (10000) মুছুন এবং মুছার জন্য আর কোনও সারি না পাওয়া পর্যন্ত এটি চালিয়ে যান। কে বিবেচনা করে যদি এটি নির্বিচারে হয়। বাছাই করলে কোয়েরিটি ধীর হয়।
tvanharp

1
আমি বুঝতে পারছি যে এই একটি প্রাচীন প্রশ্ন (ফলে বছরে) কিন্তু আমি যে মনে করেন এটা গুরুত্বপূর্ণ যে মানুষ @gbn মন্তব্য বিবেচনা । যদিও তার মন্তব্যগুলি আমার প্রদত্ত অবস্থার সাথে প্রযোজ্য নয় (LOCK সমস্যা সৃষ্টি না করে রেকর্ডগুলির ব্লকগুলি মুছে ফেলার চেষ্টা করছেন তবে সেগুলি মুছে ফেলা হয়েছে তার ক্রমটি যত্নশীল নয়) তারা সম্ভবত আপনার পরিস্থিতির ক্ষেত্রে প্রয়োগ করতে পারে। নীচের উত্তরগুলি অন্ধভাবে ব্যবহারের আগে আপনি সেগুলি বিবেচনা করেছেন তা নিশ্চিত করুন যে কোনও ধারা দ্বারা কোনও অর্ডার অন্তর্ভুক্ত নয়।
অ্যান্ড্রু স্টিৎস

উত্তর:


195

আপনার চেষ্টা করা কোডটি আসলে দুটি বিবৃতি। ক এর DELETEপরে ক SELECT

আপনি কি TOPদ্বারা আদেশ হিসাবে সংজ্ঞায়িত করবেন না ।

কোনও নির্দিষ্ট ক্রম মানদণ্ডের জন্য কোনও সিটিই বা অনুরূপ সারণী এক্সপ্রেশন থেকে মুছে ফেলা সর্বাধিক দক্ষ উপায় way

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

13
আপনি কেন পারবেন না এই নিয়ে ভাবছেন তাদের জন্য DELETE TOP (1000) FROM table ORDER BY column, এটি পড়ুন : "INSERT, আপডেট, মার্জ বা ডিলেটটি ব্যবহার করে শীর্ষের মত প্রকাশে সারিগুলি কোনও ক্রমে সাজানো হয়নি" "
নিক চাম্মাস

3
@ ম্যাগনাস হ্যাঁ 2000 না হলেও। 2000 সালে উদ্ভূত টেবিলটি ব্যবহার করা সম্ভব হতে পারে with পরীক্ষার জন্য আমার কাছে এর উদাহরণ নেই।
মার্টিন স্মিথ


2
আমি কিছুটা ভিন্ন উপায়ে কাজ করেছি (যদিও আমি মনে করি সিটিই এটি দেখতে আরও ভাল লাগবে): টি 1 টি থেকে মুছে ফেলুন (এ 1 এর মাধ্যমে শীর্ষস্থান 1000 * নির্বাচন করুন [মাইটাব] A1 দ্বারা অর্ডার) টি 1;
অ্যাবাকাস

4
@ লিয়াম - কেবল কারণ যদি সিটিইর আগে কোনও পূর্ববর্তী বিবৃতি থাকে তবে এটি সেমিকোলন দিয়ে সমাপ্ত করা দরকার যাতে এটি WITHকরেনি এমন লোকদের অভিযোগের প্রাক- সামনের সাথে এটি যুক্ত করা যায়।
মার্টিন স্মিথ

86

Sql2005 + ব্যবহারের জন্য আরও ভাল হতে পারে:

DELETE TOP (1000)
FROM [MyTab]
WHERE YourConditions

SQLl2000 এর জন্য:

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
)

আরও স্পষ্ট এবং নির্ভুল উত্তর উল্লেখ করার জন্য এবং দাবি করার জন্য ধন্যবাদ টিপি @ জিবিএন।


3
@gbn হয়ত আপনার পক্ষে অকেজো, তবে এখনও প্রশ্নটি যা জিজ্ঞাসা করছে ঠিক তা-ই।
জোছিম ইসাকসন

1
@ জোয়াচিম ইসাকসন: শীর্ষস্থানীয় সম্পর্কে পড়ুন এবং ফিরে আসুন। অর্ডার বাই দ্বারা সেট ছাড়া শীর্ষের মতো জিনিস নেই। বিকল্পভাবে, যান এবং আমাকে ভুল প্রমাণিত করে এমন একটি ক্যানোনিকাল রেফারেন্স খুঁজে বার করুন ... আপনাকে অনুসন্ধান করতে, sqlblog.com/blogs/alexender_kuznetsov/archive/2009/05/20/… এবং ব্লগস.টেকনেট /
2007/07/19

1
@gbn সারিগুলি মুছে ফেলার বিষয়ে কোনও শর্ত নেই, সুতরাং সাবকিউরিতে অর্ডারটি অকেজো
ওলেগ ডক

1
@gbn আপনি কি সাবকোয়ারিতে কোথাও উল্লেখ করেছেন - আমি 1000 টি স্বেচ্ছাসেবী সারিগুলিকে চয়নের মানদণ্ডের মধ্যে ফিল্টার করে তারপরে মুছুন। বৈধ দৃশ্য? হ্যাঁ. আমি যদি নতুন (বা) দ্বারা অর্ডার যোগ করি বা যা কিছুই পরিবর্তন করে না - আমি এখনও বেছেসেনের মানদণ্ডের মাধ্যমে ছাঁকানো 1000 সারিগুলি মুছব
ওলেগ ডক

8
@gbn আপনি যদি অর্ডার বা অর্ডার ছাড়াই শীর্ষের বৈধ ব্যবহারের সন্ধান করছেন: আমাকে এখানে এনেছে যে আমাকে কিছু মানদণ্ডের সাথে মিল রেখে সমস্ত সারি মুছে ফেলতে হবে তবে কার্য সম্পাদনের কারণে, আমি চাই না যে এটি 10,000 টিরও বেশি সারি মুছে ফেলবে don't একেবারে. এটি কোন সারিগুলি মুছে ফেলবে তা আমি চিন্তা করি না, কারণ এই জাতীয় সমস্ত সারি না যাওয়া পর্যন্ত আমি কিছুটা বিরতিতে আবার কমান্ডটি চালাব।
রিচিবান


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

4
অকেজো: শীর্ষ বা অর্ডার ছাড়াই
শীর্ষে

4
@gbn হয়ত আপনার পক্ষে অকেজো, তবে এখনও প্রশ্নটি যা জিজ্ঞাসা করছে ঠিক তা-ই।
জোছিম ইসাকসন

3
@gbn আমি দাবি করিনি যে এখানে কোনও ডিফল্ট সাজানোর অর্ডার রয়েছে বা কোয়েরিটি যে কোনও উপায়েই কার্যকর, আমি আপনাকে কেবল মনে করিয়ে দিয়েছি যে প্রশ্নটি একটি জিজ্ঞাসা করেনি তাই আপনি কী আদেশ দেওয়ার পরামর্শ দিবেন?
জোছিম ইসাকসন

2
@gbn আমি জানি না যে আপনি কেন এমন একটি বিষয়কে কেন্দ্র করে সবার প্রতি এত শত্রু। আমি দাবি করি না যে আমার উত্তরটি সব শেষ, এটি কাউকে সাহায্য করার জন্য কেবল একটি পরামর্শ। আমি মনে করি গুরুত্বটি কীগুলি যা এখানে সাব কোয়েরি থেকে ফিরে আসছে।
জেসন ড্যাম

2
এটি যা প্রশ্নকর্তা সন্ধান করছেন এটি হতে পারে। আমি অন্যদের উপর চাপ পড়ার জন্য কেবল একটি নোট যুক্ত করব যে এই জাতীয় বিবৃতি দ্বারা সারিগুলি সরিয়ে দেওয়া কোনও ক্রমে থাকার গ্যারান্টিযুক্ত নয়।
নিক চাম্মাস

3
SET ROWCOUNT 1000;

DELETE FROM [MyTable] WHERE .....

2
মাত্র 1000 সারি নিয়ে কাজ করার সময়, এটি কি সত্যই গুরুত্ব দেয় ?? যদি 100,000,000 সারি ছিল তারপর আপনার পয়েন্ট বৈধ হতে পারে, কিন্তু শুধু 1000 সারি জন্য, এই সহজ সমাধান এসকিউএল 2008. জন্য এতদূর প্রস্তাবিত দ্বারা পর্যন্ত হয়
জো বোর্ন

1

এটি দ্রুত. এটি চেষ্টা করুন:

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

YourTABLEসারণীর নাম XXদ্বারা একটি সংখ্যা দ্বারা প্রতিস্থাপন করুন , উদাহরণস্বরূপ 1000, pkআপনার টেবিলের প্রাথমিক কী ক্ষেত্রের নাম।


আপনি কার্যকরভাবে এক থেকে দুটি টেবিল তৈরি করছেন এবং তারপরে কোথায় যোগ হয়েছে তা মুছে ফেলছেন। আপনি যখন কোনও টেবিল থেকে সর্বাধিক প্রাচীন (বা সর্বাধিক) রেকর্ডগুলি মুছতে চান এটি ভাল কাজ করে, যেহেতু আপনি প্রথমে এগুলি আরোহণের অনুসারে বাছাই করতে পারেন। এই টি-স্কেলটি মাইক্রোসফ্ট গ্রহণ করেছে (এবং এটি দ্রুত)।
টেকিলা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.