回答:
かっこはUPDATEステートメントに必要です。
update top (100) table1 set field1 = 1
ORDER BY
全体のアイデアがなければ、TOP
あまり意味がありません。topの概念が意味を持つためには、どちらの方向が「上」であり、どちらが「下」であるかの一貫した定義が必要です。
それにもかかわらず、SQL Serverはそれを許可しますが、確定的な結果を保証しません。
UPDATE TOP
受け入れられた回答の構文はORDER BY
句をサポートしていませんが、CTEまたは派生テーブルを使用して目的のソート順を以下のように定義することにより、ここで確定的なセマンティクスを取得することが可能です。
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
TOP
オッズを使用しているときは、それを使用する必要があることを認めます。ORDER BY
なぜなら、興味があるのは何かの「最も」または「最も」のようなものだからです。ただし、一致するレコードを1つだけ取得する場合もあります。今日のように!データの問題(サイクル)を1つずつ修正する必要がありました。修正プロセス全体には、dbスクリプト、一部のユーザー介入、および一部のアプリケーション操作が含まれていました。どのレコードが最初に処理されるかは問題ではありませんでした。一度に1つずつ処理することを気にしました。
WHERE
、以前に処理されたレコードを除外する句があったでしょう。書かれ、受け入れられた答えとしての質問はかなり意味がありません。ところで、テーブルをキューとして使用する場合、これは非常に便利なリンクです
where
同じ行を何度も処理しないようにする句が必要です。
まだSQL Server 2000にこだわっているような人のSET ROWCOUNT {number};
ために、UPDATE
クエリの前に使用できます
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
更新を100行に制限します
少なくともSQL 2005以降は非推奨になっていますが、SQL 2017でも機能します。 https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
さらに優れているのは、インラインのテーブル値関数を使用して、TOP
更新する行(およびviaの数)を選択できることです。あれは:
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
ステートメントの構文を簡略化する真の力があります。
試してください:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
エイリアスと結合を使用して選択から更新することもできます。
UPDATE TOP (500) T
SET T.SomeColumn = 'Value'
FROM SomeTable T
INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE T.SomeOtherColumn = 1
order by
同様に使用する方法はありますか?