Я хочу обновить 100 лучших записей в SQL Server. У меня есть таблица T1
с полями F1
и F2
. T1
имеет 200 записей. Я хочу обновить поле F1
в 100 лучших записях. Как я могу обновить на основе TOP 100
в SQL Server?
Как я могу обновить 100 лучших записей на сервере sql
Ответ 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