【发布时间】:2010-11-14 23:07:44
【问题描述】:
我想更新 SQL Server 中的前 100 条记录。我有一个表T1 字段F1 和F2。 T1 有 200 条记录。我想更新前 100 条记录中的 F1 字段。如何在 SQL Server 中根据TOP 100 进行更新?
【问题讨论】:
标签: sql sql-server tsql sql-update
我想更新 SQL Server 中的前 100 条记录。我有一个表T1 字段F1 和F2。 T1 有 200 条记录。我想更新前 100 条记录中的 F1 字段。如何在 SQL Server 中根据TOP 100 进行更新?
【问题讨论】:
标签: sql sql-server tsql sql-update
注意,UPDATE 语句需要括号:
update top (100) table1 set field1 = 1
【讨论】:
order by吗?
如果没有ORDER BY,TOP 的整个想法就没有多大意义。您需要对哪个方向是“向上”和哪个方向是“向下”有一个一致的定义,这样顶部的概念才有意义。
尽管如此,SQL Server 允许,但 doesn't guarantee a deterministic result。
已接受答案中的 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 子句来排除以前处理的记录。书面和公认答案的问题非常没有意义。顺便说一句:用于将表用作队列this is quite a useful link
where 子句来避免一次又一次地处理相同的行。
update tb set f1=1 where id in (select top 100 id from tb where f1=0)
【讨论】:
update tb set f1=1 where id in (select top 100 id from tb where f1=0 order by id asc)
对于像我这样仍然坚持使用 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
【讨论】:
更酷的是,您可以使用内联表值函数来选择要更新的行(以及通过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 TOP (500) T
SET T.SomeColumn = 'Value'
FROM SomeTable T
INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE T.SomeOtherColumn = 1
【讨论】:
试试:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
【讨论】:
这段代码可以完成它的工作
UPDATE TOP (100) table_name set column_name = value;
如果你想显示最后 100 条记录,你可以根据需要使用它。
With OrnekWith
as
(
Select Top(100) * from table_name Order By ID desc
)
Update table_name Set column_name = value;
【讨论】:
TOP 限定符也可以用来限制手动错误更新的行数。
考虑以下 UPDATE 语法。
UPDATE TOP (1) table1 SET column1 = 0 WHERE column_pk = '123'
如果没有 TOP 子句,如果您正在执行手动更新并且您的鼠标文本选择仅从“UPDATE”到“WHERE”子句之前进行选择,则更新将应用于所有行。使用 TOP 子句,只有一行会得到不需要的更新。
TOP 约束可以限制缺少或不正确的 WHERE 子句或 ORDER BY 子句的损害。当知道应该只更新一行或几行时,这会很有帮助。
【讨论】: