我想用不同的ID更新單個命令中的許多行。這些ID應該在查詢中傳遞,如SQL Server:使用不同ID同時更新許多行的最佳實踐
Update table
Set Updated = 1
where ID is in
(
1
2
3
)
更進一步的困難是有兩個主鍵列需要檢查。我不想在自己的命令中更新每行,因爲服務器往返速度很慢。
什麼是更新這樣的表的最佳方式是什麼?
我想用不同的ID更新單個命令中的許多行。這些ID應該在查詢中傳遞,如SQL Server:使用不同ID同時更新許多行的最佳實踐
Update table
Set Updated = 1
where ID is in
(
1
2
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或表值參數。
如果數據量非常大,那麼您可以考慮將文本文件中的密鑰批量加載到表中。
你的語法幾乎是正確的。下面就按預期執行:
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
您可以根據逗號分隔列表中的單個主鍵進行更新。 所以你的情況:
update tblTable set updated = 1 where id in (1,2,3)
您可以使用更新where條件,就像你用SELECT命令。 你沒有使用SQL Server的版本規定,但這裏是SQL2K聯機叢書鏈接:
http://msdn.microsoft.com/en-us/library/aa260662(v=sql.80).aspx
聯機叢書SQL是開始針對這種性質的問題(即命令結構)
的好地方和複合關鍵問題? – ErikE
這取決於。
如果您的「更新記錄的選擇」是用編程語言定義的(例如,您正在用c#編寫查詢,然後將它傳遞給sql server),最簡單的解決方案是生成一系列where子句,如下所示:
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]
你是什麼由兩個主鍵列是什麼意思?一個表只能有一個主鍵(儘管它可以是一個組合)。 – Oded
你的意思是說你的主鍵是複合 - 是由多個字段組成的?如果是這樣,比**唯一的選擇**是單獨更新每條記錄,那麼您可以按照ErikE建議的方式來減少往返行程。 –
什麼版本的sql server? – ErikE