Dans PostgreSQL, il existe les mots Limit
- Offset
clés et qui permettront une pagination très simple des ensembles de résultats.
Quelle est la syntaxe équivalente pour SQL Server?
sql
sql-server
pagination
limit
offset
Earlz
la source
la source
Réponses:
L'équivalent de
LIMIT
isSET ROWCOUNT
, mais si vous voulez une pagination générique, il est préférable d'écrire une requête comme celle-ci:L'avantage ici est le paramétrage de l'offset et de la limite au cas où vous décideriez de modifier vos options de pagination (ou autoriser l'utilisateur à le faire).
Remarque: le
@Offset
paramètre doit utiliser pour cela l'indexation basée sur un plutôt que l'indexation de base zéro normale.la source
WHERE RowNum >= (@Offset + 1)
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified
. MSSQL2008 R2.Table
a 200k enregistrements, il va tout d'abord récupérer, puis appliquer la limite? Cette requête est-elle efficace?Cette fonctionnalité est désormais simplifiée dans SQL Server 2012. Cela fonctionne à partir de SQL Server 2012.
Limiter avec décalage pour sélectionner 11 à 20 lignes dans SQL Server:
OFFSET
: nombre de lignes ignoréesNEXT
: nombre requis de lignes suivantesRéférence: https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
la source
SQL_CALC_FOUND_ROWS
lors de son utilisation?Remarque: cette solution ne fonctionnera que dans SQL Server 2005 ou supérieur, car c'était à ce moment-là qu'elle a
ROW_NUMBER()
été implémentée.la source
AS xx
Vous pouvez utiliser ROW_NUMBER dans une expression de table commune pour y parvenir.
la source
Pour moi, l'utilisation de OFFSET et FETCH ensemble était lente, j'ai donc utilisé une combinaison de TOP et OFFSET comme celle-ci (ce qui était plus rapide):
Remarque: Si vous utilisez TOP et OFFSET ensemble dans la même requête comme:
Ensuite, vous obtenez une erreur, donc pour utiliser TOP et OFFSET ensemble, vous devez le séparer avec une sous-requête.
Et si vous devez utiliser SELECT DISTINCT, la requête est comme:
Remarque: l'utilisation de SELECT ROW_NUMBER avec DISTINCT n'a pas fonctionné pour moi.
la source
SELECT TOP 20 id FROM table1 where id > 10 order by date OFFSET 20 rows
, vous devez le transformer commeSELECT TOP 20 * FROM (SELECT id FROM table1 where id > 10 order by date OFFSET 20 ROWS) t1
. Je modifierai ma réponse. Merci et excusez-moi mon anglais.Un autre échantillon:
la source
Il y a ici quelqu'un qui parle de cette fonctionnalité dans sql 2011, c'est triste qu'ils choisissent un mot-clé un peu différent "OFFSET / FETCH" mais ce n'est pas standart alors ok.
la source
En ajoutant une légère variation à la solution d'Aaronaught, je paramètre généralement le numéro de page (@PageNum) et la taille de la page (@PageSize). De cette façon, chaque événement de clic de page envoie simplement le numéro de page demandé avec une taille de page configurable:
la source
Le plus proche que je pourrais faire est
Ce qui je suppose similaire à
select * from [db].[dbo].[table] LIMIT 0, 10
la source
la source
la source
la source
Puisque personne n'a encore fourni ce code:
Les points importants:
@limit
peut être remplacé par le nombre de résultats à récupérer,@offset
est le nombre de résultats à ignorerwhere
etorder by
clause, et fournira des résultats incorrects s'ils ne sont pas synchronisésorder by
est-il explicitement si c'est ce qu'il fautla source
En particulier pour SQL-SERVER, vous pouvez y parvenir de différentes manières. Pour un exemple concret, nous avons pris la table Customer ici.
Exemple 1: avec "SET ROWCOUNT"
Pour renvoyer toutes les lignes, définissez ROWCOUNT sur 0
Exemple 2: avec "ROW_NUMBER et OVER"
Exemple 3: Avec "OFFSET et FETCH", mais avec ce "ORDER BY" est obligatoire
J'espère que cela vous aide.
la source
Dans le serveur SQL, vous utiliseriez TOP avec ROW_NUMBER ()
la source
Depuis, je teste plus de fois ce script plus utile de 1 million d'enregistrements chaque page 100 enregistrements avec pagination fonctionnent plus rapidement mon PC exécute ce script 0 sec alors que le comparatif avec mysql a sa propre limite et un décalage d'environ 4,5 sec pour obtenir le résultat.
Quelqu'un peut manquer de comprendre Row_Number () trier toujours par champ spécifique. Au cas où nous aurions besoin de définir uniquement la ligne dans la séquence, utilisez:
ROW_NUMBER () OVER (ORDER BY (SELECT NULL))
Explique:
la source