我想更新SQL Server的前100条记录。我有一个包含字段F1和F2的表T1。T1有200条记录。我想更新排名前100的F1赛场。如何根据SQL Server的TOP 100进行更新?
当前回答
TOP限定符还可以用于限制手动错误更新的行数。
考虑下面的UPDATE语法。
UPDATE TOP (1) table1 SET column1 = 0 WHERE column_pk = '123'
如果没有TOP子句,如果您正在进行手动更新,并且您的鼠标文本选择仅从“update”选择到“WHERE”子句之前,则更新将应用于所有行。使用TOP子句,只有一行会得到不需要的更新。
TOP约束可以限制丢失或不正确的WHERE子句或ORDER BY子句的损害。当知道只需要更新一行或几行时,这将很有帮助。
其他回答
如果没有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'
update tb set f1=1 where id in (select top 100 id from tb where f1=0)
更酷的是,您可以使用内联表值函数来选择要更新哪些行(以及通过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语句是必需的:
update top (100) table1 set field1 = 1
TOP限定符还可以用于限制手动错误更新的行数。
考虑下面的UPDATE语法。
UPDATE TOP (1) table1 SET column1 = 0 WHERE column_pk = '123'
如果没有TOP子句,如果您正在进行手动更新,并且您的鼠标文本选择仅从“update”选择到“WHERE”子句之前,则更新将应用于所有行。使用TOP子句,只有一行会得到不需要的更新。
TOP约束可以限制丢失或不正确的WHERE子句或ORDER BY子句的损害。当知道只需要更新一行或几行时,这将很有帮助。
推荐文章
- GROUP BY with MAX(DATE)
- 删除id与其他表不匹配的sql行
- 等价的限制和偏移SQL Server?
- 如何从SQL Server中的字符串中剥离所有非字母字符?
- 为什么我不能在DELETE语句中使用别名?
- 在SQL Server Management Studio中保存带有标题的结果
- "where 1=1"语句
- 如何选择一个记录和更新它,与一个单一的查询集在Django?
- 多语句表值函数vs内联表值函数
- 如何从Oracle的表中获取列名?
- NOLOCK提示在SELECT语句中的作用
- SQL OVER()子句-它什么时候有用,为什么有用?
- 如果字段在MySQL中为空,则返回0
- 检查SQL Server登录是否已经存在
- 我如何使用ROW_NUMBER()?