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?
6 Réponses :
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. P>
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.
Vous recherchez probablement quelque chose comme ceci: où ID est la colonne clé principale de la table. p> p>
Vous pouvez également utiliser définir RowCount 400 code> au lieu d'utiliser
haut code> 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).
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. P>
Fonctionne également sur SQL 2005, mais nécessite les crochets: TOP (N). Voir SQL 2005 BOL, Déclaration de mise à jour, clause supérieure ().
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
@Quassnoi, juste curieux, quel est l'avantage d'utiliser un CTE au lieu d'un sous-sélection?
@jmGant Code>: Vous ne pouvez pas mettre à jour un sous-sélection comme dans
oracle code>,
Mise à jour (SELECT TOP 400 * ...) SET ... CODE> échouera. Un
dans code> Condition proposée par d'autres résultats obtient simplement une jointure code> code> qui est redondant ici.
En outre, cela fonctionnera même si vous n'avez pas de clé primaire code> ou ayant une clé principale composite code> (code> (dans SQL Server code>, vous ne pouvez pas utiliser Plus d'une colonne dans un
dans code> 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.
Vous pouvez utiliser la syntaxe suivante p>
Mise à jour Top (400) TBL Définir la colonne1 = '2' Où column2 = '1' Et colonne1 est null p>
Voir ce message http://balasingam.com/sql-server/update-top-n-record-in-sql-server/comment-page-1#COMMENT-227 P>
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.