ฉันต้องการอัปเดต 100 อันดับสูงสุดใน SQL Server ผมมีตารางT1
ที่มีเขตข้อมูลและF1
มี 200 บันทึก ฉันต้องการอัปเดตฟิลด์ใน 100 รายการแรกสุด ฉันจะอัปเดตตามใน SQL Server ได้อย่างไรF2
T1
F1
TOP 100
ฉันต้องการอัปเดต 100 อันดับสูงสุดใน SQL Server ผมมีตารางT1
ที่มีเขตข้อมูลและF1
มี 200 บันทึก ฉันต้องการอัปเดตฟิลด์ใน 100 รายการแรกสุด ฉันจะอัปเดตตามใน SQL Server ได้อย่างไรF2
T1
F1
TOP 100
คำตอบ:
หมายเหตุจำเป็นต้องใช้วงเล็บในคำสั่ง UPDATE:
update top (100) table1 set field1 = 1
หากไม่มีORDER BY
ความคิดทั้งหมดที่ว่าTOP
ก็ไม่สมเหตุสมผลนัก คุณต้องมีคำจำกัดความที่สอดคล้องกันว่าทิศทางใด "ขึ้น" และ "ลง" สำหรับแนวคิดด้านบนที่จะมีความหมาย
อย่างไรก็ตาม SQL Server อนุญาต แต่ไม่รับประกันผลลัพธ์ที่กำหนดไว้
UPDATE TOP
ไวยากรณ์ในคำตอบที่ได้รับการยอมรับไม่สนับสนุนORDER BY
ข้อ แต่มันก็เป็นไปได้ที่จะได้รับหมายกำหนดที่นี่โดยใช้ CTE หรือตารางที่ได้รับการกำหนดลำดับการจัดเรียงที่ต้องการดังต่อไปนี้
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
TOP
อัตราต่อรองคุณควรใช้กับORDER BY
เพราะสิ่งที่คุณสนใจนั้นเป็นเหมือน "ที่สุด" หรือ "น้อยที่สุด" ของบางสิ่ง อย่างไรก็ตามในกรณีอื่น ๆ คุณอาจสนใจรับระเบียนที่ตรงกันเพียงรายการเดียวเท่านั้น เหมือนฉันวันนี้! ฉันต้องการแก้ไขปัญหาข้อมูล (รอบ) ทีละครั้ง กระบวนการแก้ไขทั้งหมดเกี่ยวข้องกับสคริปต์ db การแทรกแซงของผู้ใช้บางส่วนและการใช้งานบางอย่าง เราไม่ได้สนใจว่ามีการจัดการบันทึกใดก่อน เราแค่ใส่ใจว่าเราจัดการพวกมันทีละครั้ง
WHERE
ประโยคที่จะไม่รวมการประมวลผลก่อนหน้านี้ คำถามตามคำตอบที่เขียนและยอมรับนั้นไม่มีความหมายเลย BTW: สำหรับการใช้ตารางเป็นคิวนี่เป็นลิงค์ที่มีประโยชน์
where
ประโยคเพื่อหลีกเลี่ยงการประมวลผลแถวเดียวกันซ้ำแล้วซ้ำอีก
สำหรับผู้ที่ชอบฉันยังคงติดอยู่กับ SQL Server 2000 SET ROWCOUNT {number};
สามารถใช้ก่อนUPDATE
แบบสอบถาม
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
จะ จำกัด การอัปเดตเป็น 100 แถว
มันถูกคัดค้านอย่างน้อยตั้งแต่ SQL 2005 แต่ ณ วันที่ SQL 2017 ยังคงใช้งานได้ https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
update tb set f1=1 where id in (select top 100 id from tb where f1=0)
สิ่งที่น่าสนใจยิ่งกว่าคือความจริงที่ว่าคุณสามารถใช้ฟังก์ชั่น Table-Valued Function เพื่อเลือกแถว (และจำนวนที่จะผ่าน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
คำสั่ง
ลอง:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
คุณสามารถอัปเดตจากการเลือกโดยใช้นามแฝงและเข้าร่วม:
UPDATE TOP (500) T
SET T.SomeColumn = 'Value'
FROM SomeTable T
INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE T.SomeOtherColumn = 1
order by
เช่นกัน?