158 votes

Comment mettre en œuvre la LIMITE avec Microsoft SQL Server?

J'ai cette requête à mysql :

select * from table1 LIMIT 10,20

Comment puis-je le faire avec Microsoft sql ?

141voto

Leon Tayson Points 1837

À partir de SQL SERVER 2005, vous pouvez le faire...

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 10 AND 20;

ou quelque chose comme ça pour l'an 2000 et au-dessous de versions...

SELECT TOP 10 * FROM (SELECT TOP 20 FROM Table ORDER BY Id) ORDER BY Id DESC

70voto

ceejayoz Points 85962

Maladroit, mais ça marchera.

SELECT TOP 10 * FROM table WHERE id NOT IN (SELECT TOP 10 id FROM table ORDER BY id) FROM table ORDER BY id

MSSQL l'omission d'une LIMITE de clause pénale, de l'OMI. Vous ne devriez pas avoir à faire ce genre d'encombrants solution de contournement.

18voto

Bill Karwin Points 204877

C'est presque un double d'une question que j'avais posée en octobre: http://stackoverflow.com/questions/216673/emulate-mysql-limit-clause-in-microsoft-sql-server-2000

Si vous utilisez Microsoft SQL Server 2000, il n'y a pas de bonne solution. La plupart des gens ont recours à la capture du résultat de la requête dans une table temporaire avec un IDENTITY clé primaire. Alors la requête à l'encontre de la colonne de clé primaire à l'aide d'un BETWEEN condition.

Si vous utilisez Microsoft SQL Server 2005 ou plus tard, vous avez un ROW_NUMBER() de la fonction, de sorte que vous pouvez obtenir le même résultat, mais éviter de la table temporaire.

SELECT t1.*
FROM (
    SELECT ROW_NUMBER OVER(ORDER BY id) AS row, t1.*
    FROM ( ...original SQL query... ) t1
) t2
WHERE t2.row BETWEEN @offset+1 AND @offset+@count;

Vous pouvez aussi écrire cela comme une expression de table commune , comme indiqué dans @Leon Tayson de réponse.

12voto

Quassnoi Points 191041
SELECT  *
FROM    (
        SELECT  TOP 20
                t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
        FROM    table1 t
        ORDER BY
                field1
        ) t
WHERE   rn > 10

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