Как я могу обновить 100 лучших записей на сервере sql

Я хочу обновить 100 лучших записей в SQL Server. У меня есть таблица T1 с полями F1 и F2. T1 имеет 200 записей. Я хочу обновить поле F1 в 100 лучших записях. Как я могу обновить на основе TOP 100 в SQL Server?

Ответ 1

Обратите внимание: скобки необходимы для операторов UPDATE:

update top (100) table1 set field1 = 1

Ответ 2

Без 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'

Ответ 3

для тех, кто, как я до сих пор застрял с 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

Ответ 4

update tb set  f1=1 where id in (select top 100 id from tb where f1=0)

Ответ 5

Что еще более холодно, так это то, что вы можете использовать встроенную функцию табличных значений, чтобы выбрать, какие строки (и сколько через TOP) должны обновляться. То есть:

UPDATE MyTable
SET [email protected]
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 [email protected] AND ...
    ORDER BY MyTable.SomeDate DESC
)

... и лежит (по моему скромному мнению) истинная сила обновления только верхних выбранных строк детерминированным образом, в то же время упрощая синтаксис оператора UPDATE.

Ответ 6

Пытаться:

UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo 
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY 
CreatedDate DESC)

Ответ 7

Вы также можете обновить из выбора, используя псевдоним и присоединиться:

UPDATE  TOP (500) T
SET     T.SomeColumn = 'Value'
FROM    SomeTable T
        INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE   T.SomeOtherColumn = 1