J'utilise SQL Server 2008 Enterprise sur Windows Server 2008. Je souhaite sélectionner le résultat du top 11 au Top 20 (par exemple, je ne suis intéressé que par le 11ème au 20e résultat). Des idées Comment écrire cette requête en TSQL efficacement? P>
Merci d'avance, George p>
3 Réponses :
Assumer un champ de tri pk, édition: Voici une variante p>
Je pense que c'est très délicat puisque quand j'ai besoin de choisir le 21ème au 30, je dois écrire une autre déclaration TSQL.
Il est assez facile de paramétrer la requête.
Cela ressemble à une belle solution. Est-ce que ça est évolutif? C'est à dire. Y aura-t-il des problèmes de performance si le MyTable Code> dispose de 500 000 lignes dedans et vous voulez parfois des rangées de 400 000 à 400 000 à 400 010?
Malheureusement, SQL Server n'offre rien de même que la syntaxe code> décalsets de MySQL. Cependant, vous voudrez peut-être essayer d'utiliser une table dérivée comme suit:
SELECT some_field FROM ( SELECT some_field, ROW_NUMBER() OVER (ORDER BY some_id) AS rownum FROM table ) AS t WHERE t.rownum BETWEEN 11 AND 20
Dois-je avoir commander par certains_id?
@ George2: Étant donné que les tableaux de bases de données relationnelles ne sont que des ensembles d'enregistrements non ordonnés, vous devez commander le résultat défini par une (ou plusieurs) colonne unique pour que la pagination ait un sens. Sinon, comment pouvez-vous dire qu'un enregistrement est le 11ème?
Ouais. Comment voudriez-vous classer les 11 et 20 ans? Sans commande par, SQL Server peut vous revenir à tous les résultats qu'il souhaite - la commande n'est pas garantie. Je ne sais pas comment vous définissez votre classement, mais quel que soit le champ de terrain qui doit aller dans la commande par code>.
limite avec décalage dans SQL Server: p> SELECT email FROM myTable
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
La question est de 2008 et c'est une fonctionnalité de 2012
@Blam: J'ai donné la réponse car elle peut être utile aux personnes qui utilisent maintenant une version mise à niveau de SQL Server. Voulez-vous que je supprime la réponse si vous estimez que cela est égaré aux gens. J'ai mis à jour la réponse maintenant.
SQL Server Offset équivalent présent en présent 2012. Voir Ma solution .