9
votes

Comment mettre à jour le top 400?

Je voudrais mettre à jour les 400 premières lignes dans une table de base de données. Le pseudo SQL est ci-dessous, comment puis-je faire cela? XXX


2 commentaires

Je présume que vous utilisez SQLServer. Est-ce correct? Notez également la réponse de HLGEM, rien ne garantit que vous obtiendrez le même résultat défini à chaque fois que vous avez exécuté cette requête à moins que vous n'ayez commandé de commander.


Retardé, pour ce faire, vous devriez utiliser SQL Server car aucun autre DBMS populaire n'a une déclaration top 400.


6 Réponses :


5
votes

Comment détermineriez-vous le top 400? Sans ordre de là, il n'y a pas de guanantee que le même ensemble serait toujours sélectionné et que les mauvais enregistrements pourraient donc être mis à jour.


0 commentaires

9
votes
 UPDATE db.dbo.tbl SET column1 = 2 WHERE
 primaryID IN (
   SELECT TOP (400) primarkyID FROM db.dbo.tbl
   WHERE column2 = 1 AND column1 IS NULL
 )
But I don't like this as there's no way to guarantee WHICH top 400, you might want to add some other type of criteria.  And even an Order By to the subquery.

0 commentaires

4
votes

Vous recherchez probablement quelque chose comme ceci: xxx

où ID est la colonne clé principale de la table.


4 commentaires

Vous pouvez également utiliser définir RowCount 400 au lieu d'utiliser haut dans la requête Voir msdn.microsoft.com/en-us/library/ms188774.aspx


Sauf que l'ensemble de RowCount est obsolète.


@Dave: Êtes-vous sûr? Je ne peux pas voir cela documenté dans le MSDN Docs MSDN.MicRosoft.com/en -us / bibliothèque / ms188774.aspx


@PJP: Si vous faites défiler un bit un peu, vous trouverez ce texte sous remarques: IMPORTANT: L'utilisation de SET RowCount n'affectera pas les instructions de supprimer, d'insertion et de mise à jour de la version suivante de SQL Server. N'utilisez pas de rowcount défini avec Supprimer, insérer et mettre à jour les instructions dans les nouveaux travaux de développement et planifiez pour modifier les applications qui l'utilisent actuellement. De plus, pour supprimer, insérer et mettre à jour les instructions qui utilisent actuellement RowCount, nous vous recommandons de les réécrire à utiliser la syntaxe supérieure. Pour plus d'informations, voir Supprimer (Transact-SQL), Insérer (transact-SQL) ou Mettre à jour (Transact-SQL).



4
votes

Si vous utilisez SQL Server 2008, la syntaxe "TOPN N" fonctionnera sur les instructions DELETE et Mettre à jour. Sinon, les autres méthodes énumérées ici là où vous identifiez les clés principales d'une sous-requête ou d'une table dérivée fonctionnera bien. Et comme d'autres l'ont fait, "la commande par" est fortement recommandée ou que les lignes que vous mettez à jour peuvent différer d'une requête à la suivante.


1 commentaires

Fonctionne également sur SQL 2005, mais nécessite les crochets: TOP (N). Voir SQL 2005 BOL, Déclaration de mise à jour, clause supérieure ().



5
votes
WITH    q AS
        (
        SELECT  TOP 400 *
        FROM    db.dbo.tb
        WHERE   column2 = 1
                AND column1 is null
        ORDER BY
                column3 -- choose your order!
        )
UPDATE  q
SET     column2 = 2

4 commentaires

@Quassnoi, juste curieux, quel est l'avantage d'utiliser un CTE au lieu d'un sous-sélection?


@jmGant : Vous ne pouvez pas mettre à jour un sous-sélection comme dans oracle , Mise à jour (SELECT TOP 400 * ...) SET ... échouera. Un dans Condition proposée par d'autres résultats obtient simplement une jointure qui est redondant ici.


En outre, cela fonctionnera même si vous n'avez pas de clé primaire ou ayant une clé principale composite (code> (dans SQL Server , vous ne pouvez pas utiliser Plus d'une colonne dans un dans prédicat)


Il doit utiliser SQL 2000, alors que SQL 2005 prend en charge la clause supérieure () pour les états de mise à jour. SQL 2000 n'a pas de CTES, il ne peut donc pas vraiment utiliser cela.



1
votes

Vous pouvez utiliser la syntaxe suivante

Mise à jour Top (400) TBL Définir la colonne1 = '2' Où column2 = '1' Et colonne1 est null

Voir ce message http://balasingam.com/sql-server/update-top-n-record-in-sql-server/comment-page-1#COMMENT-227


0 commentaires