ORDER BYとTOP句で簡単更新!上位100件のレコードをサクッと変更
SQL Serverで上位100件のレコードを更新するには、いくつかの方法があります。最も一般的な方法は、ORDER BY
句と TOP
句を使用する方法です。
方法
- 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;
- 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;
- 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';
OFFSET
と FETCH
を使用して、上位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