আমি কীভাবে এসকিএল সার্ভারে শীর্ষ 100 রেকর্ড আপডেট করতে পারি


393

আমি এসকিউএল সার্ভারে শীর্ষ 100 রেকর্ড আপডেট করতে চাই। আমি T1ক্ষেত্র F1এবং একটি টেবিল আছে F2T1200 রেকর্ড রয়েছে। আমি F1শীর্ষ 100 রেকর্ডে ফিল্ডটি আপডেট করতে চাই । TOP 100এসকিউএল সার্ভারের ভিত্তিতে আমি কীভাবে আপডেট করতে পারি ?

উত্তর:


684

দ্রষ্টব্য, আপডেটের বিবৃতিগুলির জন্য প্রথম বন্ধনীগুলি প্রয়োজনীয়:

update top (100) table1 set field1 = 1

28
কোন ধারণা কিভাবে ব্যবহার করতে order byহয়?
জো ফিলিপস

8
@ জোফিলিপস আদেশের জন্য মার্টিন স্মিথ উত্তরটি ব্যবহার করুন
jjxtra

এগুলি তবে শীর্ষ 100 রেকর্ড নয়, তবে 100 টি নির্বিচারে বেছে নেওয়া রেকর্ড। শীর্ষ 100 রেকর্ডগুলি র‌্যাঙ্ক করার জন্য কিছু অর্ডার অন্তর্ভুক্ত করবে।
থারস্টন কেটনার

1
এটি "যেমন জিজ্ঞাসা করা হয়েছে" প্রশ্নের উত্তর দেয় তবে শীর্ষগুলি কোনও অর্ডার ব্যতীত অর্থহীন (এবং অনুমানযোগ্য)। উত্তর আরও নিচে দেখুন মার্টিন স্মিথ।
অ্যান্ডি জি

1
বিটিডব্লিউ: প্রথম বন্ধনী গুরুত্বপূর্ণ!
সাইমন_উইভার

300

ORDER BYসম্পূর্ণ ধারণাটি ছাড়া খুব TOPবেশি অর্থ হয় না। শীর্ষের ধারণাটি অর্থবহ হওয়ার জন্য কোন দিকটি "আপ" এবং কোনটি "ডাউন" এর একটি ধারাবাহিক সংজ্ঞা আপনার থাকা দরকার।

তবুও এসকিউএল সার্ভার এটির অনুমতি দেয় তবে একটি নির্বিচার ফলাফলের গ্যারান্টি দেয় না

UPDATE TOPগৃহীত উত্তরে সিনট্যাক্স একটি সমর্থন করে না ORDER BYদফা কিন্তু এটি এখানে নীচে পছন্দসই হিসাবে সাজানোর ক্রম নির্ধারণ করার জন্য একটি কোটে বা উদ্ভুত টেবিল ব্যবহার করে নির্ণায়ক শব্দার্থবিদ্যা পেতে করা সম্ভব।

;WITH CTE AS 
( 
SELECT TOP 100 * 
FROM T1 
ORDER BY F2 
) 
UPDATE CTE SET F1='foo'

71
আপনি অর্থহীন বলুন তবে এটি সত্য নয়। আমি স্বীকার করি যে, / সাধারণত / আপনি যখন TOPপ্রতিকূলতাকে ব্যবহার করছেন তখন আপনার এটি ব্যবহার করা উচিত ORDER BYকারণ আপনার আগ্রহী জিনিসটি কোনও কিছুর "সর্বাধিক" বা "কমপক্ষে" এর মতো like অন্য ক্ষেত্রে, তবে আপনি কেবল একটি ম্যাচের রেকর্ড পেতে আগ্রহী হতে পারেন। আমার মতো আজ! আমার একবারে ডেটা ইস্যু (চক্র) ঠিক করা দরকার। সম্পূর্ণ ফিক্স প্রক্রিয়াটিতে একটি ডিবি স্ক্রিপ্ট, কিছু ব্যবহারকারীর হস্তক্ষেপ এবং কিছু অ্যাপ্লিকেশন অপারেশন জড়িত। প্রথমে কোন রেকর্ডটি পরিচালনা করা হয়েছিল তা আমরা যত্ন করি নি। আমরা কেবল যত্ন করেছিলাম যে আমরা তাদের একবারে পরিচালনা করছি।
মেটাফাইট

17
@ মেটাফাইট তবে তারপরে WHEREআগের প্রক্রিয়াজাত রেকর্ডগুলি বাদ দেওয়ার জন্য আপনার কাছে একটি ধারা থাকতে হবে। লিখিত এবং স্বীকৃত উত্তর হিসাবে প্রশ্নটি বেশ অর্থহীন। বিটিডাব্লু: একটি সারি হিসাবে টেবিলগুলি ব্যবহার করার জন্য এটি বেশ দরকারী লিঙ্ক
মার্টিন স্মিথ

10
অর্ডার ছাড়াই আমাকে শীর্ষটি ব্যবহার করতে হবে যাতে আমি একটি অ্যাসিঙ্ক্রোনাস প্রক্রিয়া চালাতে পারি। যেখানে ধারাটিতে ইতিমধ্যে প্রক্রিয়াজাত হয়েছে সেগুলি অন্তর্ভুক্ত করবে না, তবে আমি কেবল একবারে এতগুলি প্রক্রিয়া করতে পারি। সুতরাং এটির পুরোপুরি বৈধ ব্যবহারের কেস রয়েছে।
জেফ ডেভিস

4
@ মার্টিন স্মিথ: বলুন আপনি ব্যাচগুলিতে আপডেট করতে চান, একবারে 10000 বলুন। এর জন্য ভাল ব্যবহারের মতো বলে মনে হচ্ছে এবং অর্ডারটি কোনও ব্যাপার নয়। এটি কীভাবে "অর্থবোধ করে না"?
জে সুলিভান

5
@ নোটফিড উপরের মন্তব্যে ইতোমধ্যে মৃত্যুর বিষয়ে আলোচিত এই একই ঘটনা। যে ক্ষেত্রে আপনার ক্যোয়ারী হবে না গৃহীত উত্তর এটি হবে এক দেখতে কেমন? whereবারবার একই সারিগুলি প্রক্রিয়াজাতকরণ এড়াতে আপনার একটি ধারা প্রয়োজন ।
মার্টিন স্মিথ

14

আমার মতো যারা এখনও এসকিউএল সার্ভার 2000 এর সাথে আটকে আছেন, SET ROWCOUNT {number};তারা UPDATEক্যোয়ারির আগে ব্যবহার করা যেতে পারে

SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;

আপডেটটি 100 টি সারিতে সীমাবদ্ধ করবে

এটি এসকিউএল 2005 থেকে কমপক্ষে অবহেলা করা হয়েছে, তবে এসকিউএল 2017 হিসাবে এটি এখনও কাজ করে। https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017


1
SET ROWCOUNT কমান্ড আপডেট হওয়ার সাথে সাথে ট্রিগারগুলিকেও প্রভাবিত করে। আপনার যদি ক্যাসকেড মোছার সেট থাকে তবে চাইল্ড টেবিলে চাইল্ড সারিগুলির সারি গণনার চেয়ে বেশি উপস্থিত থাকলে এটি লেনদেনটিকে ব্যর্থ করতে পারে।
এরিকআই

এই কথাটি বলে, ROWCOUNT @RowCountParameter সেট করুন; বৈধ সিনট্যাক্স, যেখানে শীর্ষ নির্বাচন করুন @ রউকাউন্টপ্যারামটার * টেবিলের নামটি অবৈধ। আপনার যদি সারিগুলি আপডেট হওয়ার বিষয়টি কনফিগার করতে হয়, তবে আপনার কাছে ক্যাসকেড মোছার সাথে চাইল্ড টেবিলগুলি সক্ষম না থাকলে সেট ROWCOUNT # বর্তমানে আরও ভাল বিকল্প।
এরিকআই

এসকিউএল সার্ভার ২০১ In-তে এখন টপ ক্লজটিতে @ পরিবর্তনশীল ব্যবহার করা সম্ভব: ডকস.মাইক্রোসফট
আলেকজান্ডার জারুবকিন


4

এমনকি কুলারটি হ'ল এটি হ'ল আপনি কোন ইনলাইন সারণী-মূল্যবান ফাংশনটি ব্যবহার করতে পারবেন তা কোন (এবং কতটি মাধ্যমে TOP) সারি (গুলি) আপডেট করবেন তা নির্বাচন করতে। এটাই:

UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)

টেবিলের মূল্যবান ফাংশনের জন্য আপনার কাছে সারিটি পছন্দ মতো আপডেট করার মতো আকর্ষণীয় কিছু রয়েছে:

CREATE FUNCTION tvfSelectLatestRowOfMyTableMatchingCriteria
(
    @Param1 INT,
    @Param2 INT,
    @Param3 INT
)
RETURNS TABLE AS RETURN
(
    SELECT TOP(1) MyTable.*
    FROM MyTable
    JOIN MyOtherTable
      ON ...
    JOIN WhoKnowsWhatElse
      ON ...
    WHERE MyTable.SomeColumn=@Param1 AND ...
    ORDER BY MyTable.SomeDate DESC
)

..., এবং (আমার বিনীত মতে) নিখরচায় কেবলমাত্র শীর্ষ নির্বাচিত সারিগুলি আপডেট করার সত্য ক্ষমতা আছে যখন একই সাথে UPDATEবিবৃতিটির বাক্য গঠনকে সহজ করে তোলা হয়েছে।



0

আপনি উলাম ব্যবহার করে নির্বাচন থেকে আপডেটও করতে পারেন এবং যোগদান করতে পারেন:

UPDATE  TOP (500) T
SET     T.SomeColumn = 'Value'
FROM    SomeTable T
        INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE   T.SomeOtherColumn = 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.