TOP (Transact-SQL) (Français)

  • 16/03/2017
  • 11 minutes de lecture
    • V
    • M
    • r
    • c
    • d
    • +12

Sapplique à: SQL Server (toutes les versions prises en charge) Azure SQL Database Instance gérée Azure SQL Azure Synapse Analytics Parallel Data Warehouse

Limite les lignes renvoyées dans un jeu de résultats de requête à un nombre spécifié de lignes ou un pourcentage de lignes dans SQL Server. Lorsque vous utilisez TOP avec la clause ORDER BY, le jeu de résultats est limité au premier nombre N de lignes ordonnées. Sinon, TOP renvoie le premier nombre N de lignes dans un ordre non défini. Utilisez cette clause pour spécifier le nombre de lignes renvoyées par une instruction SELECT. Vous pouvez également utiliser TOP pour spécifier les lignes affectées par une instruction INSERT, UPDATE, MERGE ou DELETE.

Conventions de syntaxe Transact-SQL

Syntaxe

Voici la syntaxe pour SQL Server et Azure SQL Database:

Voici la syntaxe pour Azure Synapse Analytics et Parallel Entrepôt de données:

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 et versions antérieures, consultez la documentation des versions précédentes .

Arguments

expression
Expression numérique qui spécifie le nombre de lignes à renvoyer. expression est implicitement convertie en une valeur flottante si vous spécifiez PERCENT. Sinon, lexpression est convertie en bigint.

PERCENT
Indique que la requête ne renvoie que le premier pourcentage dexpression des lignes de lensemble de résultats. Les valeurs fractionnelles sont arrondies à la valeur entière suivante.

WITH TIES
Renvoie deux lignes ou plus qui correspondent à la dernière place dans lensemble de résultats limité. Vous devez utiliser cet argument avec la clause ORDER BY. WITH TIES peut entraîner le renvoi de plus de lignes que la valeur spécifiée dans lexpression. Par exemple, si lexpression est définie sur 5 mais que deux lignes supplémentaires correspondent aux valeurs des colonnes ORDER BY de la ligne 5, le jeu de résultats contiendra sept lignes.

Vous pouvez spécifier la clause TOP avec le WITH TIES argument uniquement dans les instructions SELECT, et uniquement si vous avez également spécifié la clause ORDER BY. Lordre renvoyé pour lier les enregistrements est arbitraire. ORDER BY naffecte pas cette règle.

Bonnes pratiques

Dans une instruction SELECT, utilisez toujours une clause ORDER BY avec la clause TOP. Parce que cest le seul moyen dindiquer de manière prévisible quelles lignes sont affectées par TOP.

Utilisez OFFSET et FETCH dans la clause ORDER BY au lieu de la clause TOP pour implémenter une solution de pagination de requêtes. Une solution de pagination ( cest-à-dire que lenvoi de blocs ou de « pages » de données au client) est plus facile à implémenter à laide des clauses OFFSET et FETCH. Pour plus dinformations, consultez Clause ORDER BY (Transact-SQL).

Utilisez TOP (ou OFFSET et FETCH) au lieu de SET ROWCOUNT pour limiter le nombre de lignes renvoyées. Ces méthodes sont préférables à lutilisation de SET ROWCOUNT pour les raisons suivantes:

  • Dans le cadre dune instruction SELECT, loptimiseur de requêtes peut prendre en compte la valeur de lexpression dans les clauses TOP ou FETCH lors de loptimisation de la requête. Comme vous utilisez SET ROWCOUNT en dehors dune instruction qui exécute une requête, sa valeur ne peut pas être prise en compte dans un plan de requête.

Support de compatibilité

Pour la compatibilité descendante, les parenthèses sont facultatives dans les instructions SELECT si lexpression est un entier const fourmi. Nous vous recommandons de toujours utiliser des parenthèses pour TOP dans les instructions SELECT. Cela assure la cohérence avec son utilisation requise dans les instructions INSERT, UPDATE, MERGE et DELETE.

Interopérabilité

Lexpression TOP naffecte pas les instructions qui pourraient sexécuter à cause dun déclencheur. Les tables insérées et supprimées dans les déclencheurs renvoient uniquement les lignes qui sont réellement affectées par les instructions INSERT, UPDATE, MERGE ou DELETE. Par exemple, si un INSERT TRIGGER se déclenche à la suite dune instruction INSERT utilisant une clause TOP.

SQL Server permet de mettre à jour les lignes via les vues. Comme vous pouvez inclure la clause TOP dans la définition de la vue, certaines lignes peuvent disparaître de la vue si les lignes ne répondent plus aux exigences de lexpression TOP en raison dune mise à jour .

Lorsquelle est spécifiée dans linstruction MERGE, la clause TOP sapplique une fois que la table source entière et la table cible entière sont jointes. Et les lignes jointes qui ne sont pas admissibles à une insertion, une mise à jour ou une suppression laction sont supprimées. La clause TOP réduit davantage le nombre de lignes jointes à la valeur spécifiée et les actions dinsertion, de mise à jour ou de suppression sappliquent aux lignes jointes restantes de manière non ordonnée. Autrement dit, il ny a aucun ordre dans lequel les lignes sont distribuées parmi les actions définies dans les clauses WHEN.Par exemple, si la spécification de TOP (10) affecte 10 lignes, sept de ces lignes peuvent être mises à jour et trois insérées. Ou, un peut être supprimé, cinq mis à jour et quatre insérés, et ainsi de suite. Étant donné que linstruction MERGE effectue une analyse complète de la table des tables source et cible, les performances dE / S peuvent être affectées lorsque vous utilisez la clause TOP pour modifier une table volumineuse en créant plusieurs lots. Dans ce scénario, il est important de sassurer que tous les lots successifs ciblent de nouvelles lignes.

Soyez prudent lorsque vous « redéfinissez la clause TOP dans une requête contenant UNION, UNION ALL, EXCEPT ou INTERSECT opérateur. Il est possible décrire une requête qui renvoie des résultats inattendus car lordre dans lequel les clauses TOP et ORDER BY sont traitées logiquement nest pas toujours intuitif lorsque ces opérateurs sont utilisés dans une opération de sélection. Par exemple, compte tenu du tableau et des données suivants, supposons que vous souhaitiez rendre la voiture rouge la moins chère et la voiture bleue la moins chère. Autrement dit, la berline rouge et la camionnette bleue.

Pour obtenir ces résultats, vous pouvez écrire la requête suivante.

Voici le jeu de résultats.

Les résultats inattendus sont renvoyés car la clause TOP sexécute logiquement avant la clause ORDER BY, qui trie les résultats de lopérateur (UNION ALL dans ce cas). Ainsi, la requête précédente renvoie une voiture rouge et une voiture bleue, puis classe le résultat de cette union en fonction du prix. Lexemple suivant montre la méthode correcte décriture de cette requête pour obtenir le résultat souhaité.

En utilisant TOP et ORDER BY dans une opération de sous-sélection, vous vous assurez que les résultats de la clause ORDER BY sont appliqués au TOP et ne pas trier le résultat de lopération UNION.

Voici lensemble de résultats.

Limitations et restrictions

Lorsque vous utilisez TOP avec INSERT, UPDATE, MERGE ou DELETE, les lignes référencées ne sont pas organisées dans un ordre quelconque. Et vous ne pouvez pas spécifier directement la clause ORDER BY dans ces instructions. Si vous devez utiliser TOP pour insérer, supprimer ou modifier des lignes dans un ordre chronologique significatif, utilisez TOP avec une clause ORDER BY spécifiée dans une instruction subselect. Consultez la section Exemples suivante dans cet article.

Vous ne pouvez pas utiliser TOP dans des instructions UPDATE et DELETE sur des vues partitionnées.

Vous ne pouvez pas combiner TOP avec OFFSET et FETCH dans la même expression de requête (dans la même étendue de requête). Pour plus dinformations, consultez la clause ORDER BY (Transact-SQL).

Exemples

Catégorie Éléments de syntaxe présentés
Syntaxe de base TOP • PERCENT
Y compris les valeurs de lien WITH TIES
Limitation des lignes affectées par DELETE, INSERT ou UPDATE DELETE • INSERT • UPDATE

Syntaxe de base

Les exemples de cette section illustrent les fonctionnalités de base de la clause ORDER BY en utilisant la syntaxe minimale requise.

UNE. Utilisation de TOP avec une valeur constante

Les exemples suivants utilisent une valeur constante pour spécifier le nombre demployés renvoyés dans lensemble de résultats de la requête. Dans le premier exemple, les 10 premières lignes non définies sont renvoyées car une clause ORDER BY nest pas utilisée. Dans le second exemple, une clause ORDER BY est utilisée pour renvoyer les 10 premiers employés récemment embauchés.

B. Utilisation de TOP avec une variable

Lexemple suivant utilise une variable pour spécifier le nombre demployés renvoyés dans lensemble de résultats de la requête.

C. Spécification dun pourcentage

Lexemple suivant utilise PERCENT pour spécifier le nombre demployés renvoyés dans lensemble de résultats de la requête. Il y en a 290 employés de la table HumanResources.Employee. Étant donné que cinq pour cent de 290 est une valeur fractionnaire, la valeur est arrondie au nombre entier supérieur.

Inclusion de valeurs de liens

A. Utilisation de WITH TIES pour inclure des lignes qui correspondent aux valeurs de la dernière ligne

Lexemple suivant obtient le premier 10 pourcentage de tous les employés ayant le salaire le plus élevé a nd les renvoie par ordre décroissant en fonction de leur salaire. La spécification de WITH TIES garantit que les employés dont le salaire est égal au salaire le plus bas retourné (la dernière ligne) sont également inclus dans lensemble de résultats, même sil dépasse 10 pourcentage demployés.

Limitation des lignes affectées par DELETE, INSERT ou UPDATE

A. Utilisation de TOP pour limiter le nombre de lignes supprimées

Lorsque vous utilisez une clause TOP (n) avec DELETE, lopération de suppression est effectuée sur une sélection indéfinie de n nombre de lignes. Autrement dit, linstruction DELETE choisit nimporte quel nombre (n) de lignes qui répondent aux critères définis dans la clause WHERE.Lexemple suivant supprime les 20 lignes de la table PurchaseOrderDetail dont les dates déchéance sont antérieures au 1er juillet 2002.

Si vous souhaitez utiliser TOP pour supprimer des lignes dans un ordre chronologique significatif, utilisez TOP avec ORDER BY dans une instruction subselect. La requête suivante supprime les 10 lignes de la table PurchaseOrderDetail dont les dates déchéance sont les plus anciennes. Pour garantir que seules 10 lignes sont supprimées, la colonne spécifiée dans linstruction subselect (PurchaseOrderID) est la clé primaire de la table. Lutilisation dune colonne non-clé dans linstruction subselect peut entraîner la suppression de plus de 10 lignes si la colonne spécifiée contient des valeurs en double.

B. Utilisation de TOP pour limiter le nombre de lignes insérées

Lexemple suivant crée le tableau EmployeeSales et insère le nom et les données de ventes cumulatives de lannée pour les cinq premiers employés de la table HumanResources.Employee. Linstruction INSERT choisit cinq lignes renvoyées par linstruction SELECT qui répondent aux critères définis dans la clause WHERE. La clause OUTPUT affiche les lignes insérées dans la table EmployeeSales. Notez que la clause ORDER BY dans linstruction SELECT nest pas utilisée pour déterminer les cinq premiers employés.

Si vous souhaitez utiliser TOP pour insérer des lignes dans un ordre chronologique significatif, utilisez TOP avec ORDER BY dans un instruction subselect. Lexemple suivant montre comment procéder. La clause OUTPUT affiche les lignes insérées dans la table EmployeeSales. Notez que les cinq premiers employés sont désormais insérés en fonction des résultats de la clause ORDER BY au lieu de lignes non définies.

C. Utilisation de TOP pour limiter le nombre de lignes mises à jour

Lexemple suivant utilise la clause TOP pour mettre à jour les lignes dune table. Lorsque vous utilisez une clause TOP (n) avec UPDATE, lopération de mise à jour sexécute sur un nombre indéfini de lignes. Autrement dit, linstruction UPDATE choisit nimporte quel nombre (n) de lignes qui correspondent les critères définis dans la clause WHERE. Lexemple suivant attribue 10 clients dun vendeur à un autre.

Si vous devez utilisez TOP pour appliquer les mises à jour dans une chronologie significative, vous devez utiliser TOP avec ORDER BY dans une instruction de sous-sélection. Lexemple suivant met à jour les heures de vacances des 10 employés avec les premières dates dembauche.

Exemples: Azure Synapse Analytics et Parallel Data Warehouse

Lexemple suivant renvoie les 31 premières lignes qui correspondent aux critères de requête. La clause ORDER BY garantit que les 31 lignes renvoyées sont les 31 premières lignes en fonction dun ordre alphabétique de la colonne LastName.

Utilisation de TOP sans spécifier de liens.

Résultat: 31 lignes sont renvoyées.

En utilisant TOP, en spécifiant WITH TIES.

Résultat: 33 lignes sont renvoyées, car trois employés nommés Brown sont à égalité pour la 31e ligne.

Voir aussi

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *