210 votes

Serveur SQL SELECT LAST N Rows

C'est une question connue mais la meilleure solution que j'ai trouvée est quelque chose du genre :

SELECT TOP N *
FROM MyTable
ORDER BY Id DESC

J'ai un tableau avec beaucoup de lignes. Il n'est pas possible d'utiliser cette requête car elle prend beaucoup de temps. Alors comment puis-je faire pour sélectionner les N dernières lignes sans utiliser ORDER BY ?

EDIT

Désolé, cette question fait double emploi avec celle de celui-ci

158voto

Niru Mukund Shah Points 2260

Vous pouvez demander au serveur SQL de sélectionner les N dernières lignes avec la requête suivante :

select * from tbl_name order by id desc limit N;

65voto

ABI Points 402

J'ai testé le code de JonVD, mais j'ai trouvé qu'il était très lent, 6s.

Ce code a pris 0s.

SELECT TOP(5) ORDERID, CUSTOMERID, OrderDate    
FROM Orders where EmployeeID=5    
Order By OrderDate DESC

43voto

JonVD Points 2355

Vous pouvez également le faire en utilisant la fonction ROW NUMBER BY PARTITION. Vous trouverez un excellent exemple aquí :

J'utilise la table Orders de la base de données Northwind... Maintenant, récupérons les 5 dernières commandes passées par l'employé 5 :

SELECT ORDERID, CUSTOMERID, OrderDate
FROM
(
    SELECT ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY OrderDate DESC) AS OrderedDate,*
    FROM Orders
) as ordlist

WHERE ordlist.EmployeeID = 5
AND ordlist.OrderedDate <= 5

19voto

Si vous voulez sélectionner les derniers numéros des lignes d'un tableau.

La syntaxe sera la suivante

 select * from table_name except select top 
 (numbers of rows - how many rows you want)* from table_name

Ces déclarations fonctionnent mais de manière différente. Merci.

 select * from Products except select top (77-10) * from Products

de cette façon, vous pouvez obtenir les 10 dernières lignes mais l'ordre sera descendant.

select top 10 * from products
 order by productId desc 

 select * from products
 where productid in (select top 10 productID from products)
 order by productID desc

 select * from products where productID not in 
 (select top((select COUNT(*) from products ) -10 )productID from products)

12voto

Hakam Fostok Points 4765

D'une manière très générale et pour supporter le serveur SQL voici

SELECT TOP(N) *
FROM tbl_name
ORDER BY tbl_id DESC

et pour ce qui est de la performance, elle n'est pas mauvaise (moins d'une seconde pour plus de 10 000 enregistrements sur la machine serveur).

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