J'essaye de faire quelque chose comme:
SELECT * FROM table LIMIT 10,20
ou
SELECT * FROM table LIMIT 10 OFFSET 10
mais en utilisant SQL Server
La seule solution que j'ai trouvée semble exagérée:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases
) a WHERE row > 5 and row <= 10
J'ai aussi trouvé :
SELECT TOP 10 * FROM stuff;
... mais ce n'est pas ce que je veux faire car je ne peux pas spécifier la limite de départ.
Y a-t-il une autre façon pour moi de faire ça?
Aussi, juste curieux, y a-t-il une raison pour laquelle SQL Server ne prend pas en charge la LIMIT
fonction ou quelque chose de similaire? Je ne veux pas être méchant, mais cela ressemble vraiment à quelque chose dont un SGBD a besoin ... Si c'est le cas, je suis désolé d'être si ignorant! Je travaille avec MySQL et SQL + depuis 5 ans donc ...
sql
sql-server
pagination
limit
Marcgg
la source
la source
ROW_NUMBER()
et limiter avecTOP
pour la largeur de la plage et uneWHERE
condition pour une limite de la plage est le meilleur que j'ai pu réaliser. J'ai également remarqué de bien meilleures performances si laTOP
clause utilise un littéral au lieu d'une variableRéponses:
La
LIMIT
clause ne fait pas partie du SQL standard. Il est pris en charge en tant qu'extension de fournisseur de SQL par MySQL, PostgreSQL et SQLite.D'autres marques de base de données peuvent avoir des fonctionnalités similaires (par exemple
TOP
dans Microsoft SQL Server), mais celles-ci ne fonctionnent pas toujours de la même manière.Il est difficile d'utiliser
TOP
dans Microsoft SQL Server pour imiter laLIMIT
clause. Il y a des cas où cela ne fonctionne tout simplement pas.La solution que vous avez présentée en utilisant
ROW_NUMBER()
est disponible dans Microsoft SQL Server 2005 et versions ultérieures. C'est la meilleure solution (pour l'instant) qui fonctionne uniquement dans le cadre de la requête.Une autre solution consiste à utiliser
TOP
pour récupérer le premier lignes de comptage + décalage , puis à utiliser l'API pour rechercher au-delà des premières lignes de décalage .Voir également:
la source
Pour SQL Server 2012 +, vous pouvez utiliser .
la source
offset
ou pouvez-vous laisser cette ligne de côté (en supposant que vous ne vouliez pas de décalage)?OFFSET 0 ROWS
Parse error at line: 4, column: 1: Incorrect syntax near 'OFFSET'
comme vous l'avez trouvé, c'est la méthode de serveur sql préférée:
la source
a
après la sélection intérieure? Je suppose que vous donnez un alias à la sélection interne, mais vous ne semblez jamais l'utiliser ... Devriez-vous le fairea.row
au lieu de simplementrow
?( )
table dérivée, mais il la laissera aller si vous oubliez ensuite de l'utiliser pour faire référence aux colonnes. Je l'ai réparé cependant ...Si vous utilisez SQL Server 2012+, votez pour la réponse de Martin Smith et utilisez les extensions
OFFSET
etFETCH NEXT
pourORDER BY
,Si vous avez la malchance d'être coincé avec une version antérieure, vous pouvez faire quelque chose comme ça,
Je crois que c'est fonctionnellement équivalent à
et la manière la plus performante que je connaisse de le faire dans TSQL, avant MS SQL 2012.
S'il y a beaucoup de lignes, vous pouvez obtenir de meilleures performances en utilisant une table temporaire au lieu d'un CTE.
la source
Malheureusement,
ROW_NUMBER()
c'est le mieux que vous puissiez faire. C'est en fait plus correct, car les résultats d'une clauselimit
outop
n'ont pas vraiment de sens sans un ordre spécifique. Mais c'est toujours une douleur à faire.Mise à jour: Sql Server 2012 ajoute une
limit
fonctionnalité similaire via les mots-clés OFFSET et FETCH . C'est l'approche standard ansi, par opposition àLIMIT
, qui est une extension MySql non standard.la source
Que dis-tu de ça?
Il vous donne les 10 dernières lignes des 20 premières lignes. Un inconvénient est que l'ordre est inversé, mais au moins c'est facile à retenir.
la source
Devrait donner des enregistrements 11-20. Probablement pas trop efficace si vous augmentez pour obtenir d'autres pages, et ne savez pas comment cela pourrait être affecté par la commande. Il se peut que vous deviez le spécifier dans les deux instructions WHERE.
la source
Un bon moyen est de créer une procédure:
tout comme limite 0,2 /////////////// exécuter la pagination 0,4
la source
Juste pour la solution d'enregistrement qui fonctionne sur la plupart des moteurs de base de données, mais peut-être pas la plus efficace:
Remarque Pelase: la dernière page contiendrait toujours des lignes ReturnCount, quel que soit SkipCount. Mais cela pourrait être une bonne chose dans de nombreux cas.
la source
L'équivalent de LIMIT est SET ROWCOUNT, mais si vous voulez une pagination générique, il est préférable d'écrire une requête comme celle-ci:
la source
Imprime les lignes de 10 à 15.
la source
Jusqu'à présent, ce format est ce qui fonctionne pour moi (pas la meilleure performance cependant):
Une note sur le côté, paginer sur des données dynamiques peut conduire à des résultats étranges / inattendus.
la source
De la documentation en ligne de MS SQL Server ( http://technet.microsoft.com/en-us/library/ms186734.aspx ), voici leur exemple que j'ai testé et fonctionne, pour récupérer un ensemble spécifique de lignes. ROW_NUMBER nécessite un OVER, mais vous pouvez commander ce que vous voulez:
la source
Utilisez tout le serveur SQL:; avec tbl as (SELECT ROW_NUMBER () over (order by (select 1)) as RowIndex, * from table) select top 10 * from tbl where RowIndex> = 10
la source
il imprimera de 15 à 25 comme limite dans MYSQl
la source