Existe-t-il un moyen dans SQL Server d'obtenir les résultats à partir d'un décalage donné? Par exemple, dans un autre type de base de données SQL, il est possible de faire:
SELECT * FROM MyTable OFFSET 50 LIMIT 25
pour obtenir des résultats 51-75. Cette construction ne semble pas exister dans SQL Server.
Comment puis-je accomplir cela sans charger toutes les lignes dont je ne me soucie pas? Merci!
sql
sql-server
Alex
la source
la source
Réponses:
J'éviterais d'utiliser
SELECT *
. Spécifiez les colonnes que vous voulez réellement, même si elles peuvent être toutes.SQL Server 2005+
SQL Server 2000
Pagination efficace de grands ensembles de résultats dans SQL Server 2000
Une méthode plus efficace pour la pagination de grands ensembles de résultats
la source
SELECT *
signifie que si la structure de la table change, votre requête s'exécute toujours, mais donne des résultats différents. Si une colonne est ajoutée, cela peut être utile (même si vous devez toujours l'utiliser par son nom quelque part); si une colonne est supprimée ou renommée, il est préférable pour votre SQL de casser visiblement que le code plus bas se comportant bizarrement car une variable n'est pas initialisée.Si vous traitez toutes les pages dans l'ordre, alors simplement se souvenir de la dernière valeur de clé vue sur la page précédente et utiliser
TOP (25) ... WHERE Key > @last_key ORDER BY Key
peut être la méthode la plus performante si des index appropriés existent pour permettre une recherche efficace - ou un curseur API si ce n'est pas le cas. .Pour sélectionner une page arbitraire, la meilleure solution pour SQL Server 2005 - 2008 R2 est probablement
ROW_NUMBER
etBETWEEN
Pour SQL Server 2012+, vous pouvez utiliser la clause ORDER BY améliorée pour ce besoin.
Bien qu'il reste à voir dans quelle mesure cette option sera performante .
la source
C'est un moyen (SQL2000)
et c'est une autre façon (SQL 2005)
la source
Vous pouvez utiliser la
ROW_NUMBER()
fonction pour obtenir ce que vous voulez:la source
Il existe
OFFSET .. FETCH
dans SQL Server 2012, mais vous devrez spécifier uneORDER BY
colonne.Si vous n'avez vraiment pas de colonne explicite que vous pourriez passer comme
ORDER BY
colonne (comme d'autres l'ont suggéré), vous pouvez utiliser cette astuce:... ou
Nous l'utilisons dans jOOQ lorsque les utilisateurs ne spécifient pas explicitement une commande. Cela produira alors une commande assez aléatoire sans aucun coût supplémentaire.
la source
Pour les tables avec des colonnes de données plus nombreuses et volumineuses, je préfère:
-
Elle offre de bien meilleures performances sur les tables contenant des données volumineuses telles que les BLOB, car la fonction ROW_NUMBER n'a qu'à parcourir une colonne et seules les lignes correspondantes sont renvoyées avec toutes les colonnes.
la source
Voir ma sélection pour paginateur
Cela résout la pagination;)
la source
la source
Selon votre version, vous ne pouvez pas le faire directement, mais vous pouvez faire quelque chose de piraté comme
où «champ» est la clé.
la source
Ce qui suit affichera 25 enregistrements à l'exclusion des 50 premiers enregistrements fonctionne dans SQL Server 2012.
vous pouvez remplacer l'ID en tant que votre condition
la source
Vous devez être prudent lorsque vous utilisez l'
ROW_NUMBER() OVER (ORDER BY)
instruction car les performances sont assez médiocres. Il en va de même pour l'utilisation d'expressions de table communes avecROW_NUMBER()
c'est encore pire. J'utilise l'extrait de code suivant qui s'est avéré légèrement plus rapide que l'utilisation d'une variable de table avec une identité pour fournir le numéro de page.la source
J'utilise cette technique pour la pagination. Je ne récupère pas toutes les lignes. Par exemple, si ma page doit afficher les 100 premières lignes, je ne récupère que les 100 avec la clause where. La sortie du SQL doit avoir une clé unique.
Le tableau contient les éléments suivants:
Le même rang sera attribué à plus d'un KeyId.
SQL est
select top 2 * from Table1 where Rank >= @Rank and ID > @Id
Pour la première fois, je passe 0 pour les deux. Le deuxième temps passe 1 & 14. 3e temps passe 2 et 6 ....
La valeur du 10ème enregistrement Rank & Id est transmise au suivant
Cela aura le moins de stress sur le système
la source
Dans SqlServer2005, vous pouvez effectuer les opérations suivantes:
la source
@Offset + @Limit - 1
? Si @Limit vaut 10, cela renverra 11 lignes.La meilleure façon de le faire sans perdre de temps à commander des disques est la suivante:
cela prend moins d'une seconde!
meilleure solution pour les grandes tables.
la source
Cela fait un moment que je cherche cette réponse (pour les requêtes génériques) et j'ai découvert une autre façon de le faire sur SQL Server 2000+ en utilisant ROWCOUNT et des curseurs et sans TOP ni aucune table temporaire.
En utilisant le,
SET ROWCOUNT [OFFSET+LIMIT]
vous pouvez limiter les résultats, et avec les curseurs, allez directement à la ligne que vous souhaitez, puis bouclez jusqu'à la fin.Donc, votre requête serait comme ceci:
la source
Avec SQL Server 2012 (11.x) et versions ultérieures et Azure SQL Database, vous pouvez également avoir "fetch_row_count_expression", vous pouvez également avoir la clause ORDER BY avec cela.
https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15
Remarque OFFSET Spécifie le nombre de lignes à ignorer avant de commencer à renvoyer des lignes à partir de l'expression de requête. Ce n'est PAS le numéro de la ligne de départ. Donc, il doit être 0 pour inclure le premier enregistrement.
la source