64 votes

Comment obtenir N lignes à partir de la ligne M d'une table triée en T-SQL ?

Il existe un moyen simple d'obtenir les N premières lignes d'un tableau :

SELECT TOP 10 * FROM MyTable ORDER BY MyColumn

Existe-t-il un moyen efficace d'interroger M lignes à partir de la ligne N ?

Par exemple,

Id Value
1    a
2    b
3    c
4    d
5    e
6    f

Et une requête comme celle-ci

SELECT [3,2] * FROM MyTable ORDER BY MyColumn /* hypothetical syntax */

interroge 2 lignes à partir de la 3e ligne, c'est-à-dire que les 3e et 4e lignes sont renvoyées.

91voto

Jan Zich Points 5701

MISE À JOUR Si vous utilisez SQL 2012, une nouvelle syntaxe a été ajoutée pour faciliter cette opération. Voir Mettre en œuvre la fonctionnalité de pagination (sauter / prendre) avec cette requête

Je pense que la solution la plus élégante consiste à utiliser la fonction ROW_NUMBER (disponible à partir de MS SQL Server 2005) :

WITH NumberedMyTable AS
(
    SELECT
        Id,
        Value,
        ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber
    FROM
        MyTable
)
SELECT
    Id,
    Value
FROM
    NumberedMyTable
WHERE
    RowNumber BETWEEN @From AND @To

8voto

Prashant Points 41

Si vous souhaitez sélectionner 100 enregistrements à partir du 25e enregistrement :

select TOP 100 * from TableName
where PrimaryKeyField 
   NOT IN(Select TOP 24 PrimaryKeyField from TableName);

5voto

Harper Shelby Points 13395

Moche, bricolé, mais qui devrait fonctionner :

select top(M + N - 1) * from TableName
except
select top(N - 1) * from TableName

3voto

Probablement bon pour les petits résultats, fonctionne dans toutes les versions de TSQL :

SELECT 
        * 
FROM
     (SELECT TOP (N) * 
      FROM 
            (SELECT TOP (M + N - 1) 
             FROM 
                   Table
             ORDER BY 
                      MyColumn) qasc
      ORDER BY 
               MyColumn DESC) qdesc
 ORDER BY 
         MyColumn

3voto

wildplasser Points 17900
        -- *some* implementations may support this syntax (mysql?)
SELECT Id,Value
FROM xxx
ORDER BY Id
LIMIT 2 , 0
   ;

        -- Separate LIMIT, OFFSET
SELECT Id,Value
FROM xxx
ORDER BY Id
LIMIT 2 OFFSET 2
   ;

        -- SQL-2008 syntax
SELECT Id,Value
FROM xxx
ORDER BY Id
OFFSET 4
FETCH NEXT 2 ROWS ONLY
  ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X