SQL Serverのトップ100レコードを更新したいです。フィールドT1
とF1
を持つテーブルF2
があります。 T1
には200レコードがあります。トップ100レコードのF1
フィールドを更新したいです。 SQL ServerでTOP 100
に基づいて更新する方法を教えてください。
UPDATE文には括弧が必要です。
update top (100) table1 set field1 = 1
ORDER BY
がなければ、TOP
の概念全体はあまり意味がありません。トップの概念を意味のあるものにするためには、どちらの方向が「上」でどれが「下」であるかについて、一貫した定義が必要です。
それにもかかわらず、SQL Serverでは許可されていますが、 確定的な結果は保証されません 。
受け入れられた回答のUPDATE TOP
構文はORDER BY
節をサポートしませんが、CTEまたは派生テーブルを使用して以下のように目的のソート順を定義することで、確定的セマンティクスを取得できます。
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
私のようにまだSQL Server 2000を使い続けている人のために、UPDATE
クエリの前にSET ROWCOUNT {number};
を使うことができます
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
更新を100行に制限します
少なくともSQL 2005以降は推奨されなくなりましたが、SQL 2017以降はまだ機能します。 https://docs.Microsoft.com/ja-jp/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
update tb set f1=1 where id in (select top 100 id from tb where f1=0)
さらにクールなのは、インラインテーブル値関数を使用して、更新する行(およびTOP
name__による行数)を選択できることです。あれは:
UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
テーブル値関数では、更新する行を選択するのに面白いことがあります。
CREATE FUNCTION tvfSelectLatestRowOfMyTableMatchingCriteria
(
@Param1 INT,
@Param2 INT,
@Param3 INT
)
RETURNS TABLE AS RETURN
(
SELECT TOP(1) MyTable.*
FROM MyTable
JOIN MyOtherTable
ON ...
JOIN WhoKnowsWhatElse
ON ...
WHERE MyTable.SomeColumn=@Param1 AND ...
ORDER BY MyTable.SomeDate DESC
)
... UPDATE
name__ステートメントの構文を単純化すると同時に、選択された最上行のみを確定的に更新する真の力があります(私の謙虚な意見です)。
別名と結合を使用してselectから更新することもできます。
UPDATE TOP (500) T
SET T.SomeColumn = 'Value'
FROM SomeTable T
INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE T.SomeOtherColumn = 1
試してください:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)