異なる ID を使用して、1 つのコマンドで多くの行を更新したいと考えています。これらの ID は、次のようにクエリで渡す必要があります。
Update table
Set Updated = 1
where ID is in
(
1
2
3
)
さらに難しいのは、チェックする主キー列が 2 つあることです。サーバーの往復のために非常に遅いため、独自のコマンドで各行を更新したくありません。
このようなテーブルを更新する最良の方法は何ですか?
異なる ID を使用して、1 つのコマンドで多くの行を更新したいと考えています。これらの ID は、次のようにクエリで渡す必要があります。
Update table
Set Updated = 1
where ID is in
(
1
2
3
)
さらに難しいのは、チェックする主キー列が 2 つあることです。サーバーの往復のために非常に遅いため、独自のコマンドで各行を更新したくありません。
このようなテーブルを更新する最良の方法は何ですか?
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、またはテーブル値パラメーターのいずれかです。
データ量が単純に膨大な場合は、テキスト ファイルからテーブルにキーを一括読み込みすることを検討してください。
場合によります。
更新するレコードの「選択」がプログラミング言語で定義されている場合(たとえば、クエリをc#で記述し、それをSQLサーバーに渡す場合)、最も簡単な解決策は、次のような一連の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]
あなたの構文はほぼ正しかった。以下は期待どおりに実行されます。
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)
update where 条件は、SELECT コマンドと同じように使用できます。SQL Server のバージョンについては規定していませんが、SQL2k Books Online のリンクは次のとおりです。
http://msdn.microsoft.com/en-us/library/aa260662(v=sql.80).aspx
SQL Books Online は、この性質 (つまり、コマンド構造) の質問を開始するのに適した場所です。