我想用不同的ID更新单个命令中的许多行。这些ID应该在查询中传递,如
Update table
Set Updated = 1
where ID is in
(
1
2
3
)
进一步的困难是要检查两个主键列。我不想在自己的命令中更新每一行,因为它因服务器往返而非常慢。
更新这样的表的最佳方法是什么?
答案 0 :(得分:3)
将表连接到包含VALUES子句(SQL 2008)或一系列UNION ALL SELECT的派生表。
UPDATE T
SET Col = 1
FROM dbo.Table T
INNER JOIN (
VALUES
(1, 3),
(3, 5),
(5, 7)
) X (ID1, ID2)
ON T.ID1 = X.ID1
AND T.ID2 = X.ID2
对于SQL 2005及更早版本:
UPDATE T
SET Col = 1
FROM dbo.Table T
INNER JOIN (
SELECT 1, 3
UNION ALL SELECT 3, 5
UNION ALL SELECT 5, 7
) X (ID1, ID2)
ON T.ID1 = X.ID1
AND T.ID2 = X.ID2
或者,插入临时表并加入其中。您还可以创建一个存储过程,该存储过程接受包含您需要加入的所有键的参数。参数可以是文本(您可以拆分),xml或表值参数。
如果数据量非常大,那么您可以考虑将密钥从文本文件批量加载到表中。
答案 1 :(得分:1)
你的语法几乎是正确的。以下将按预期执行:
Update table
Set Updated = 1
where ID IN
(
1,
2,
3
)
如果需要匹配多个列,则需要拥有包含这些列的数据源 - 临时表,表变量或表值参数可以正常工作。您可以在此源上加入您的表并在其上运行更新。
UPDATE table
SET Updated = 1
FROM table
INNER JOIN otherTable
ON table.Col1 = otherTable.Col1
AND table.Col2 = otherTable.Col2
答案 2 :(得分:1)
您可以根据逗号分隔列表中的单个主键进行更新。 所以在你的情况下:
update tblTable set updated = 1 where id in (1,2,3)
您可以像使用SELECT命令一样使用条件更新。 您没有规定SQL Server的版本,但这里是SQL2K联机丛书链接:
http://msdn.microsoft.com/en-us/library/aa260662(v=sql.80).aspx
对于这种性质的问题(即命令结构),SQL Books Online是一个很好的起点
答案 3 :(得分:1)
取决于。
如果要更新的记录的“选择”是用编程语言定义的(例如,您是用c#编写查询然后将其传递给sql server),那么最简单的解决方案是生成一系列where子句,如下所示: / p>
OR (KeyColumn1 = @FilterValue1_1 AND KeyColumn2 = @FilterValue2_1)
OR (KeyColumn1 = @FilterValue1_2 AND KeyColumn2 = @FilterValue2_2)
如果您的选择直接来自另一个查询,请将其嵌入更新语句中,如下所示:
UPDATE
[TableToUpdate]
SET
[ColumnToUpdate] = @NewValue
FROM
[TableToUpdate]
INNER JOIN [FilterTable]
ON [FilterTable].[KeyColumn1] = [TableToUpdate].[KeyColumn1]
AND [FilterTable].[KeyColumn2] = [TableToUpdate].[KeyColumn2]
WHERE
[FilterTable].[ColumnToFilter] = @ValueToFilter
或者像这样:
UPDATE
[TableToUpdate]
SET
[ColumnToUpdate] = @NewValue
FROM
[TableToUpdate]
INNER JOIN
(
SELECT
[FilterTable].[KeyColumn1],
[FilterTable].[KeyColumn2]
FROM
[FilterTable]
WHERE
[FilterTable].[ColumnToFilter] = @ValueToFilter
)
AS [Filter]
ON [Filter].[KeyColumn1] = [TableToUpdate].[KeyColumn1]
AND [Filter].[KeyColumn2] = [TableToUpdate].[KeyColumn2]
或者甚至喜欢这样:)
;WITH [Filter] AS
(
SELECT
[FilterTable].[KeyColumn1],
[FilterTable].[KeyColumn2]
FROM
[FilterTable]
WHERE
[FilterTable].[ColumnToFilter] = @ValueToFilter
)
UPDATE
[TableToUpdate]
SET
[ColumnToUpdate] = @NewValue
FROM
[TableToUpdate]
INNER JOIN [Filter]
ON [Filter].[KeyColumn1] = [TableToUpdate].[KeyColumn1]
AND [Filter].[KeyColumn2] = [TableToUpdate].[KeyColumn2]