web-dev-qa-db-fra.com

comment puis-je mettre à jour les 100 meilleurs enregistrements du serveur SQL

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?

338
Rajesh

Notez que les parenthèses sont obligatoires pour les instructions UPDATE:

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

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

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

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

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.

4
Michael Goldshteyn

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
0
Vanderlei Pires

Essayer:

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