web-dev-qa-db-ja.com

SQL Serverのトップ100レコードを更新する方法

SQL Serverのトップ100レコードを更新したいです。フィールドT1F1を持つテーブルF2があります。 T1には200レコードがあります。トップ100レコードのF1フィールドを更新したいです。 SQL ServerでTOP 100に基づいて更新する方法を教えてください。

356
Rajesh

UPDATE文には括弧が必要です。

update top (100) table1 set field1 = 1
616
Umair Ahmed

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'
283
Martin Smith

私のようにまだ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

14
Claudio B
update tb set  f1=1 where id in (select top 100 id from tb where f1=0)
12
hyyxing

さらにクールなのは、インラインテーブル値関数を使用して、更新する行(およびTOPname__による行数)を選択できることです。あれは:

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
)

... UPDATEname__ステートメントの構文を単純化すると同時に、選択された最上行のみを確定的に更新する真の力があります(私の謙虚な意見です)。

4

別名と結合を使用して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
0
Vanderlei Pires

試してください:

UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo 
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY 
CreatedDate DESC)