Je souhaite mettre à jour les 100 meilleurs enregistrements de SQL Server. J'ai une table T1
avec les champs F1
et F2
. T1
a 200 enregistrements. Je souhaite mettre à jour le champ F1
dans les 100 meilleurs enregistrements. Comment puis-je mettre à jour sur la base de TOP 100
dans SQL Server?
Notez que les parenthèses sont obligatoires pour les instructions UPDATE:
update top (100) table1 set field1 = 1
Sans ORDER BY
, l'idée de TOP
n'a pas beaucoup de sens. Vous devez avoir une définition cohérente des directions «haut» et «bas» pour que le concept de haut soit significatif.
Néanmoins, SQL Server le permet mais ne garantit pas un résultat déterministe .
La syntaxe UPDATE TOP
dans la réponse acceptée ne prend pas en charge une clause ORDER BY
, mais il est possible d'obtenir ici une sémantique déterministe en utilisant un CTE ou une table dérivée pour définir l'ordre de tri souhaité, comme indiqué ci-dessous.
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
pour ceux qui, comme moi, sont toujours bloqués avec SQL Server 2000, SET ROWCOUNT {number};
peut être utilisé avant la requête UPDATE
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
limitera la mise à jour à 100 lignes
Il est obsolète au moins depuis SQL 2005, mais à partir de SQL 2017, il fonctionne toujours. https://docs.Microsoft.com/en-us/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)
Ce qui est encore plus cool, c’est le fait que vous pouvez utiliser une fonction inline Table-Valued pour sélectionner les rangées (et combien via TOP
) à mettre à jour. C'est:
UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
Pour la fonction table value, vous avez quelque chose d'intéressant à sélectionner la ligne à mettre à jour comme:
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
)
..., et à mon humble avis, réside le véritable pouvoir de ne mettre à jour que les premières lignes sélectionnées de manière déterministe tout en simplifiant la syntaxe de l'instruction UPDATE
.
Vous pouvez également mettre à jour à partir de select using alias et rejoindre:
UPDATE TOP (500) T
SET T.SomeColumn = 'Value'
FROM SomeTable T
INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE T.SomeOtherColumn = 1
Essayer:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)