1

異なる ID を使用して、1 つのコマンドで多くの行を更新したいと考えています。これらの ID は、次のようにクエリで渡す必要があります。

Update table
Set Updated = 1
where ID is in 
(
     1
     2
     3
)

さらに難しいのは、チェックする主キー列が 2 つあることです。サーバーの往復のために非常に遅いため、独自のコマンドで各行を更新したくありません。

このようなテーブルを更新する最良の方法は何ですか?

4

4 に答える 4

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、またはテーブル値パラメーターのいずれかです。

データ量が単純に膨大な場合は、テキスト ファイルからテーブルにキーを一括読み込みすることを検討してください。

于 2012-11-28T09:48:17.427 に答える
1

場合によります。

更新するレコードの「選択」がプログラミング言語で定義されている場合(たとえば、クエリを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]
于 2012-11-28T10:08:56.193 に答える
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
于 2012-11-28T09:47:07.103 に答える
1

カンマ区切りリスト内の単一の主キーに基づいて更新できます。だからあなたの場合:

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 は、この性質 (つまり、コマンド構造) の質問を開始するのに適した場所です。

于 2012-11-28T09:50:01.947 に答える