সারিবদ্ধ সংখ্যা () সহ এসকিউএল আপডেট


113

আমি আমার বর্ধিত সংখ্যা সহ CODE_DEST কলামটি আপডেট করতে চাই। আমার আছে:

CODE_DEST   RS_NOM
null        qsdf
null        sdfqsdfqsdf
null        qsdfqsdf

আমি এটি আপডেট করতে চাই:

CODE_DEST   RS_NOM
1           qsdf
2           sdfqsdfqsdf
3           qsdfqsdf

আমি এই কোডটি চেষ্টা করেছি:

UPDATE DESTINATAIRE_TEMP
SET CODE_DEST = TheId 
FROM (SELECT  Row_Number()   OVER (ORDER BY [RS_NOM]) AS TheId FROM DESTINATAIRE_TEMP)

এটি কারণ কাজ করে না )

আমি চেষ্টাও করেছি:

WITH DESTINATAIRE_TEMP AS
  (
    SELECT 
    ROW_NUMBER() OVER (ORDER BY [RS_NOM] DESC) AS RN
    FROM DESTINATAIRE_TEMP
  )
UPDATE DESTINATAIRE_TEMP SET CODE_DEST=RN

তবে এটি ইউনিয়নের কারণেও কাজ করে না।

ROW_NUMBER()এসকিউএল সার্ভার ২০০৮ আর 2 এ ফাংশনটি ব্যবহার করে আমি কীভাবে একটি কলাম আপডেট করতে পারি ?


নমুনা ডেটা এবং প্রত্যাশিত ফলাফল পোস্ট করুন, এটির সাথে এসকিউএল উত্তর পাওয়ার সর্বোত্তম উপায়। নাহলে তোমার? কোনও UPDATE myCol = myCol+1 FROM MyTable WHERE ID=@MyID
অর্থবোধ করে

উত্তর:


189

আরও একটি বিকল্প

UPDATE x
SET x.CODE_DEST = x.New_CODE_DEST
FROM (
      SELECT CODE_DEST, ROW_NUMBER() OVER (ORDER BY [RS_NOM]) AS New_CODE_DEST
      FROM DESTINATAIRE_TEMP
      ) x

এটি কি একটি উজ্জ্বল উত্তর, বা এটি কি উজ্জ্বল যে এসকিউএল সার্ভার কোনও নেস্টেড নির্বাচন করে আপডেট করতে পারে? আমার মনে হয় দুজনেই ....
বিগজিম

আপনি যেখানে একটি বিধি দিয়ে ভবিষ্যতের আপডেট কর্মক্ষমতা ব্যাপকভাবে উন্নত করতে পারেন (এর উপর ভিত্তি করে আমার উত্তর দেখুন)
সাইমন_উইভার

72
DECLARE @id INT 
SET @id = 0 
UPDATE DESTINATAIRE_TEMP
SET @id = CODE_DEST = @id + 1 
GO 

এটা চেষ্টা কর

http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/


2
উপরেরগুলির মধ্যে একটি যা এসকিউএল সার্ভারে আমার জন্য কাজ করেছে 2012
আনিয়া হোপ

11
চমৎকার উত্তর! চেষ্টা করুন: SET CODE_DEST = @id, @id = @id + 1পাঠযোগ্যতার জন্য।
আর। অস্টারহোল্ট

46
With UpdateData  As
(
SELECT RS_NOM,
ROW_NUMBER() OVER (ORDER BY [RS_NOM] DESC) AS RN
FROM DESTINATAIRE_TEMP
)
UPDATE DESTINATAIRE_TEMP SET CODE_DEST = RN
FROM DESTINATAIRE_TEMP
INNER JOIN UpdateData ON DESTINATAIRE_TEMP.RS_NOM = UpdateData.RS_NOM

3
এটি কেবল তখনই কাজ করে যদি কলাম RS_NOM এর মানগুলি অনন্য হয়, তাই না? আমি সন্দেহ করি যে এটি অনুমান করা যেতে পারে।
টবি

17

আপনার দ্বিতীয় প্রয়াসটি মূলত ব্যর্থ হয়েছে কারণ আপনি সিটিইটিকে অন্তর্নিহিত টেবিলের মতো নাম দিয়েছিলেন এবং সিটিইকে এমন রূপ দিয়েছেন যেন এটি পুনরাবৃত্ত সিটিই , কারণ এটি মূলত নিজেকেই রেফারেন্স করে। একটি পুনরাবৃত্ত সিটিই অবশ্যই একটি নির্দিষ্ট কাঠামো থাকতে পারে যার জন্য UNION ALLসেট অপারেটরের ব্যবহার প্রয়োজন ।

পরিবর্তে, আপনি কেবল সিটিইকে একটি আলাদা নাম দেওয়ার পাশাপাশি এটিতে লক্ষ্য কলাম যুক্ত করতে পারতেন:

With SomeName As
(
SELECT 
CODE_DEST,
ROW_NUMBER() OVER (ORDER BY [RS_NOM] DESC) AS RN
FROM DESTINATAIRE_TEMP
)
UPDATE SomeName SET CODE_DEST=RN

16

এটি @ আলেকসান্ডার ফেডোরেনকো জবাবের একটি পরিবর্তিত সংস্করণ যেখানে একটি বিধি যুক্ত করেছে:

UPDATE x
SET x.CODE_DEST = x.New_CODE_DEST
FROM (
      SELECT CODE_DEST, ROW_NUMBER() OVER (ORDER BY [RS_NOM]) AS New_CODE_DEST
      FROM DESTINATAIRE_TEMP
      ) x
WHERE x.CODE_DEST <> x.New_CODE_DEST AND x.CODE_DEST IS NOT NULL

WHERE ক্লজটি যুক্ত করে আমি পরবর্তী আপডেটগুলির জন্য কর্মক্ষমতা ব্যাপকভাবে উন্নত দেখতে পেয়েছি। এসকিএল সার্ভার মনে করে সারিটি আপডেট করার পরেও মানটি ইতিমধ্যে উপস্থিত রয়েছে এবং এটি করতে সময় লাগে, সুতরাং যেখানে ক্লজ যুক্ত করা এটি সারিগুলিতে সরে যায় যেখানে মানটি পরিবর্তন হয়নি। আমাকে বলতে হবে যে এটি আমার ক্যোয়ারীটি কীভাবে চালাতে পারে তা সম্পর্কে আমি অবাক হয়েছি।

দাবি অস্বীকার: আমি কোনও ডিবি বিশেষজ্ঞ নই, এবং আমি আমার অনুচ্ছেদের জন্য পার্টিশন বাই ব্যবহার করছি যাতে এই প্রশ্নের জন্য ঠিক একই ফলাফল না হয়। আমার জন্য প্রশ্নের মধ্যে থাকা কলামটি কোনও গ্রাহকের প্রদত্ত অর্ডার, সুতরাং সেটটি সেট হয়ে যাওয়ার পরে মানটি সাধারণত পরিবর্তিত হয় না।

আপনার সূচী রয়েছে তাও নিশ্চিত করুন, বিশেষত নির্বাচনী বিবৃতিতে আপনার কাছে একটি শুল্ক রয়েছে। ফিল্টারিং সূচকটি আমার জন্য দুর্দান্ত কাজ করেছে কারণ আমি পেমেন্টের স্থিতির উপর ভিত্তি করে ফিল্টারিং করছি।


দ্বারা আমার পার্টিশন ব্যবহার করে জিজ্ঞাসা

UPDATE  UpdateTarget
SET     PaidOrderIndex = New_PaidOrderIndex
FROM
(
    SELECT  PaidOrderIndex, SimpleMembershipUserName, ROW_NUMBER() OVER(PARTITION BY SimpleMembershipUserName ORDER BY OrderId) AS New_PaidOrderIndex
    FROM    [Order]
    WHERE   PaymentStatusTypeId in (2,3,6) and SimpleMembershipUserName is not null
) AS UpdateTarget

WHERE UpdateTarget.PaidOrderIndex <> UpdateTarget.New_PaidOrderIndex AND UpdateTarget.PaidOrderIndex IS NOT NULL

-- test to 'break' some of the rows, and then run the UPDATE again
update [order] set PaidOrderIndex = 2 where PaidOrderIndex=3

'কুল নল নয়' অংশটির প্রয়োজন নেই যদি কলামটি শোধনযোগ্য নয়।


যখন আমি বলি যে পারফরম্যান্স বৃদ্ধি প্রচুর পরিমাণে হয়েছিল তখন আমি বোঝাতে চাইছি যে অল্প সংখ্যক সারি আপডেট করার সময় এটি মূলত তাত্ক্ষণিক ছিল। ডান সূচীগুলির সাহায্যে আমি একটি আপডেট অর্জন করতে সক্ষম হয়েছি যা একইসাথে 'অভ্যন্তরীণ' ক্যোয়ারী হিসাবে সময় নেয়:

  SELECT  PaidOrderIndex, SimpleMembershipUserName, ROW_NUMBER() OVER(PARTITION BY SimpleMembershipUserName ORDER BY OrderId) AS New_PaidOrderIndex
    FROM    [Order]
    WHERE   PaymentStatusTypeId in (2,3,6) and SimpleMembershipUserName is not null

@ আলেকসান্দার ফেডোরেনকো সত্য কথা বলতে পেরে আমি আশ্চর্য হয়েছি যে এটি কাজ করেছে তবে খুশী হয়েছে :)
সূচিগুলি

1
এই দরকারী টিপ জন্য ধন্যবাদ। শুভেচ্ছান্তে.
সেদাত কুমকু

3

আমি আমার পরিস্থিতির জন্য এটি করেছি এবং কাজ করেছি

WITH myUpdate (id, myRowNumber )
AS
( 
    SELECT id, ROW_NUMBER() over (order by ID) As myRowNumber
    FROM AspNetUsers
    WHERE  UserType='Customer' 
 )

update AspNetUsers set EmployeeCode = FORMAT(myRowNumber,'00000#') 
FROM myUpdate
    left join AspNetUsers u on u.Id=myUpdate.id

1

কার্সার আপডেট করার সহজ ও সহজ উপায়

UPDATE Cursor
SET Cursor.CODE = Cursor.New_CODE
FROM (
  SELECT CODE, ROW_NUMBER() OVER (ORDER BY [CODE]) AS New_CODE
  FROM Table Where CODE BETWEEN 1000 AND 1999
  ) Cursor

1

যদি টেবিলের সম্পর্ক না থাকে তবে কেবল সারি নম্বর দিয়ে নতুন টেবিলের মধ্যে সমস্তটি অনুলিপি করুন এবং পুরাতনটিকে সরিয়ে পুরানোটির সাথে নতুন নামকরণ করুন।

Select   RowNum = ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) , * INTO cdm.dbo.SALES2018 from 
(
select * from SALE2018) as SalesSource
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.