Renvoyer des lignes entre une plage spécifique, avec une instruction select
Je suis à la recherche pour certains expresion comme ceci (à l'aide de SQL Server 2008)
SELECT TOP 10 columName FROM tableName
Mais au lieu de cela, j'ai besoin des valeurs entre 10 et 20. Et je me demande si il y a un moyen de le faire en utilisant une seule instruction SELECT.
Par exemple c'est inutile:
SELECT columName FROM
(SELECT ROW_NUMBER() OVER(ORDER BY someId) AS RowNum, * FROM tableName) AS alias
WHERE RowNum BETWEEN 10 AND 20
Parce que la sélectionner à l'intérieur des parenthèses est déjà le retour de tous les résultats, et je suis à la recherche pour éviter que, en raison de la performance.
source d'informationauteur user1823901
Vous devez vous connecter pour publier un commentaire.
Il y a un truc avec
row_number
qui n'implique pas le tri de toutes les lignes.Essayez ceci:
Vous ne pouvez pas utiliser une constante dans le
order by
. Toutefois, vous pouvez utiliser une expression qui correspond à une constante. SQL Server reconnaît cela et juste retourne les lignes comme on l'a constaté, correctement énumérés.Pourquoi pensez-vous que SQL Server permettrait d'évaluer l'ensemble de la requête interne? En supposant que votre colonne de tri est indexé, il vous suffit de lire les 20 premières valeurs. Si vous êtes vraiment nerveux à ce que vous pourriez faire ceci:
mais je suis sûr que le plan de requête est la même de toute façon.
(Vraiment) Fixe comme par Aaron commentaire.
http://sqlfiddle.com/#!3/db162/6
Utilisation de SQL Server 2012 pour aller chercher/aller!
Il n'y a rien de mieux que ce que vous décrivez pour les anciennes versions de sql server. Peut-être que l'utilisation CTE, mais peu probable de faire une différence.
ou, vous pouvez supprimer le top 10 lignes et ensuite obtenir 10 prochaines lignes, mais je double quelqu'un pour le faire.
Une option de plus
Vous pouvez créer une table temporaire qui est ordonné de la manière que vous voulez comme:
SÉLECTIONNEZ la fonction ROW_NUMBER() OVER(ORDER BY someId) RowNum, * from tableName
en ##tempTable
...
De cette manière vous avez une liste ordonnée de lignes.
et peut simplement des requêtes par un numéro de ligne les fois suivantes au lieu de faire la requête interne à de multiples reprises.