8
votes

SQL Server Offset équivalent

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?

Merci d'avance, George


1 commentaires

SQL Server Offset équivalent présent en présent 2012. Voir Ma solution .


3 Réponses :


2
votes

Assumer un champ de tri pk, xxx

édition: Voici une variante xxx


3 commentaires

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 dispose de 500 000 lignes dedans et vous voulez parfois des rangées de 400 000 à 400 000 à 400 010?



17
votes

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


3 commentaires

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 .



5
votes

Voir la solution suivante est applicable uniquement pour SQL Server 2012 à partir de 2012. strong>

limite avec décalage dans SQL Server: p>

SELECT email FROM myTable
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;


2 commentaires

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.