ORDER BYとTOP句で簡単更新!上位100件のレコードをサクッと変更

2024-04-02

SQL Serverで上位100件のレコードを更新するには、いくつかの方法があります。最も一般的な方法は、ORDER BY 句と TOP 句を使用する方法です。

方法

  1. ORDER BY 句と TOP 句を使用する

この方法は、更新したい列に基づいてレコードを昇順または降順に並べ替え、上位100件を更新します。

UPDATE TOP (100)
[テーブル名]
SET [列名] = [新しい値]
ORDER BY [列名] [ASC | DESC];
  • TOP (100): 上位100件のレコードを更新することを指定します。
  • [テーブル名]: 更新するテーブルの名前を指定します。
  • [新しい値]: 列に設定する新しい値を指定します。
  • ORDER BY [列名]: レコードを並べ替える列を指定します。
  • [ASC | DESC]: 昇順または降順を指定します。

Customers テーブルの FirstName 列の値を、上位100件のレコードについて "John" に更新するには、次のクエリを使用します。

UPDATE TOP (100)
Customers
SET FirstName = 'John'
ORDER BY FirstName ASC;
  1. ROW_NUMBER() 関数を使用する

この方法は、ROW_NUMBER() 関数を使用してレコードに番号を割り当て、上位100件のレコードを更新します。

UPDATE c
SET [列名] = [新しい値]
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY [列名] [ASC | DESC]) AS RowNum
    FROM [テーブル名]
) AS c
WHERE c.RowNum BETWEEN 1 AND 100;
  • ROW_NUMBER() 関数: レコードに番号を割り当てます。
UPDATE c
SET FirstName = 'John'
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY FirstName ASC) AS RowNum
    FROM Customers
) AS c
WHERE c.RowNum BETWEEN 1 AND 100;
  1. WHILE ループを使用する

この方法は、WHILE ループを使用して上位100件のレコードを更新します。

DECLARE @i INT = 1;

WHILE @i <= 100
BEGIN
    UPDATE [テーブル名]
    SET [列名] = [新しい値]
    WHERE [列名] IN (
        SELECT TOP (1) [列名]
        FROM [テーブル名]
        ORDER BY [列名] [ASC | DESC]
        OFFSET @i ROWS
    );

    SET @i = @i + 1;
END;
  • @i: ループカウンタ変数です。
  • OFFSET @i ROWS: 最初の @i 件のレコードをスキップします。
DECLARE @i INT = 1;

WHILE @i <= 100
BEGIN
    UPDATE Customers
    SET FirstName = 'John'
    WHERE FirstName IN (
        SELECT TOP (1) FirstName
        FROM Customers
        ORDER BY FirstName ASC
        OFFSET @i ROWS
    );

    SET @i = @i + 1;
END;

注意事項

  • 上記の方法は、テーブルのサイズやインデックスの有無によってパフォーマンスが異なります。
  • 大量のレコードを更新する場合は、トランザクションログのサイズが大きくなる可能性があります。
  • 更新する前に、必ずバックアップを取ってください。



-- テーブル Customers の FirstName 列の値を、上位100件のレコードについて "John" に更新する

UPDATE TOP (100)
Customers
SET FirstName = 'John'
ORDER BY FirstName ASC;
-- テーブル Customers の FirstName 列の値を、上位100件のレコードについて "John" に更新する

UPDATE c
SET FirstName = 'John'
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY FirstName ASC) AS RowNum
    FROM Customers
) AS c
WHERE c.RowNum BETWEEN 1 AND 100;
-- テーブル Customers の FirstName 列の値を、上位100件のレコードについて "John" に更新する

DECLARE @i INT = 1;

WHILE @i <= 100
BEGIN
    UPDATE Customers
    SET FirstName = 'John'
    WHERE FirstName IN (
        SELECT TOP (1) FirstName
        FROM Customers
        ORDER BY FirstName ASC
        OFFSET @i ROWS
    );

    SET @i = @i + 1;
END;

その他のサンプルコード

  • 特定の条件を満たす上位100件のレコードを更新する
-- テーブル Customers の FirstName 列の値を、
-- 性別が "Male" で、年齢が 20 歳以上のレコードについて "John" に更新する

UPDATE TOP (100)
Customers
SET FirstName = 'John'
WHERE Gender = 'Male'
AND Age >= 20
ORDER BY FirstName ASC;
  • 更新する列の値を計算式で指定する
-- テーブル Customers の LastName 列の値を、
-- FirstName と Age を連結した値で更新する

UPDATE TOP (100)
Customers
SET LastName = FirstName + ' ' + Age
ORDER BY FirstName ASC;
  • 実際のコードは、環境や要件に合わせて変更する必要があります。



SQL Serverで上位100件のレコードを更新するその他の方法

CTE を使用して、上位100件のレコードを一時テーブルに格納し、そのテーブルを更新することができます。

-- テーブル Customers の FirstName 列の値を、上位100件のレコードについて "John" に更新する

WITH Top100 AS (
    SELECT TOP (100) *
    FROM Customers
    ORDER BY FirstName ASC
)
UPDATE Top100
SET FirstName = 'John';

OFFSETFETCH を使用して、上位100件のレコードを更新することができます。

-- テーブル Customers の FirstName 列の値を、上位100件のレコードについて "John" に更新する

DECLARE @i INT = 0;

WHILE @i < 100
BEGIN
    UPDATE Customers
    SET FirstName = 'John'
    ORDER BY FirstName ASC
    OFFSET @i ROWS
    FETCH NEXT 1 ROWS ONLY;

    SET @i = @i + 1;
END;

スクリプトを使用する

SQL Server Management Studio (SSMS) などのツールを使用して、スクリプトを実行することができます。

第三者製のツールを使用する

上位100件のレコードを更新する機能を提供する、第三者製のツールを使用することができます。

  • 上記の方法のいずれを使用する場合でも、必ずバックアップを取ってください。
  • 大量のレコードを更新する場合は、パフォーマンスに影響を与える可能性があります。

sql sql-server t-sql


FOR XML PATH('')を使ってサブクエリから複数の行を1つのフィールドに結合する

SQL Server Management Studio (SSMS)データベースSSMS を開き、データベースに接続します。新しいクエリウィンドウを開き、次のコードを入力します。上記のコードは、JoinRows という名前の関数を作成します。この関数は、次の引数を受け取ります。...


SQLとMS-Accessで別のテーブルから抽出されたレコードをテーブルに挿入する方法

このチュートリアルでは、SQLとMS-Accessを使って、別のテーブルから抽出されたレコードを別のテーブルに挿入する方法を解説します。前提条件SQLとMS-Accessの基本的な知識テーブルとレコードの概念手順INSERT INTO ステートメント...


SQL Serverでクエリが何も返さない場合にデフォルト行を設定する方法

SELECT ステートメントは、通常、テーブルからデータを取得します。しかし、条件に合致するデータがない場合、何も返さないこともあります。この場合、デフォルト行を設定することで、常に1行のデータを表示することができます。方法デフォルト行を設定するには、次の2つの方法があります。...


NOT EXISTS、EXISTS、LEFT JOIN、IN演算子:外部キーと行選択

NOT EXISTS を使用すると、別のテーブルに一致するエントリがない行を選択できます。 構文は以下のようになります。この例では、table1 から table2 に一致するエントリがない行を選択します。 table1. foreign_key_column は table2...


SQL Serverで列を削除してもエラーが出ない方法:CHECK CONSTRAINT、NOCHECK、WITH (NO CHECK) オプションの活用

このエラーは、DROP COLUMN ステートメントを使用してテーブルから列を削除しようとしたときに発生します。しかし、その列が他のオブジェクト(制約、インデックス、ビューなど)によって参照されている場合、このエラーが発生します。解決策このエラーを解決するには、以下のいずれかの方法を実行する必要があります。...