2008-11-22 6 views

Répondre

3

Sans commande, c'est impossible. Qu'est-ce qui définit le "bas"? Les éléments suivants sélectionnent 5 lignes en fonction de leur stockage dans la base de données.

SELECT TOP 5 * FROM [TableName]

+0

A droite, vous pouvez également ajouter une "commande par colx desc" en bas 5 en fonction des index. c'est à dire. les 5 premiers * SONT * les 5 derniers si vous inversez la commande. –

+0

Ce n'est pas correct. Cette requête sélectionne 5 lignes ** mais pas (toujours) ** en fonction de leur stockage dans la base de données. –

1

Vous pouvez les récupérer de la mémoire.
Donc d'abord, vous obtenez les lignes dans un DataSet, puis récupérez les 5 dernières sur le DataSet.

34

Ceci est juste au sujet de la requête la plus bizarre que j'ai jamais écrit, mais je suis sûr qu'il obtient les « 5 dernières » lignes d'une table sans commande:

select * 
from issues 
where issueid not in (
    select top (
     (select count(*) from issues) - 5 
    ) issueid 
    from issues 
) 

Notez que ce utilise La capacité de SQL Server 2005 à transmettre une valeur dans la clause "top" ne fonctionne pas sur SQL Server 2000.

+0

Si, enfin, vous voulez dire dans l'ordre de la clé en clusters, alors je suis foireux ça ne marche pas –

+0

J'ai testé cela sur une table qui n'a pas d'index clusterisé, et il a retourné les cinq dernières lignes que je reçois en faisant un simple "select * from issues". –

+0

Et juste essayé sur une table avec une clé primaire "identity int", et cela a fonctionné là aussi. J'ai les "cinq derniers" rangs. –

2

Eh bien, les "cinq dernières lignes" sont en fait les cinq dernières lignes en fonction de votre index clusterisé. Votre index clusterisé, par définition, est la façon dont les lignes sont ordonnées. Donc, vous ne pouvez vraiment pas obtenir les "cinq dernières lignes" sans ordre. Vous pouvez cependant obtenir les cinq dernières lignes en ce qui concerne l'index clusterisé.

SELECT TOP 5 * FROM MyTable 
ORDER BY MyCLusteredIndexColumn1, MyCLusteredIndexColumnq, ..., MyCLusteredIndexColumnN DESC 
1

Il y a une astuce pratique qui fonctionne dans certaines bases de données pour la commande pour la base de données,

SELECT * DÉCRET TableName PAR vrai

Apparemment, cela peut fonctionner conjointement avec une de l'autre suggestions affichées ici pour laisser les résultats dans l'ordre "ils sont sortis de la base de données", qui dans certaines bases de données, est l'ordre dans lequel ils ont été modifiés.

8

La façon dont votre question est formulée vous donne l'impression que vous pensez avoir phys utiliser les données de la table pour les récupérer dans l'ordre souhaité. Si tel est le cas, ce n'est pas le cas, la clause ORDER BY existe à cette fin. L'ordre physique dans lequel les enregistrements sont stockés reste inchangé lors de l'utilisation de ORDER BY. Les enregistrements sont triés en mémoire (ou dans l'espace disque temporaire) avant d'être renvoyés.

Notez que l'ordre dans lequel les enregistrements sont renvoyés n'est pas garanti sans l'utilisation d'une clause ORDER BY. Donc, bien que toutes les suggestions ici puissent fonctionner, il n'y a aucune raison de penser qu'elles continueront à fonctionner, et vous ne pouvez pas non plus prouver qu'elles fonctionnent dans tous les cas avec votre base de données actuelle. C'est par conception - je suppose que c'est pour donner au moteur de base de données la liberté de faire comme avec les enregistrements afin d'obtenir les meilleures performances dans le cas où il n'y a pas d'ordre explicite spécifié.

En supposant que vous vouliez les 5 derniers enregistrements triés par le nom du champ dans l'ordre croissant, vous pouvez faire quelque chose comme ça, qui devrait fonctionner dans les deux SQL 2000 ou 2005:

select Name 
from (
    select top 5 Name 
    from MyTable 
    order by Name desc 
) a 
order by Name asc 
+1

Cela devrait être marqué comme la bonne réponse (et le plus compatible). – AshesToAshes

2

Si vous savez combien de lignes il y aura au total, vous pouvez utiliser la fonction ROW_NUMBER(). Voici un examble de MSDN (http://msdn.microsoft.com/en-us/library/ms186734.aspx)

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 50 AND 60; 
27

Supposons que vous ayez un index sur id, ce sera rapide comme l'éclair:

SELECT * FROM [MyTable] WHERE [id] > (SELECT MAX([id]) - 5 FROM [MyTable]) 
+7

Ceci n'est sûr que si vous n'avez supprimé aucun enregistrement. c'est à dire. Si votre ID max = 100, mais vous avez supprimé l'enregistrement 99, vous ne vous retrouverez qu'avec 4 enregistrements, et non 5. – Amber

1
select * 
from table 
order by empno(primary key) desc 
fetch first 5 rows only 
+0

Comme écrit, sélectionne toutes les lignes dans l'ordre décroissant, pas seulement le premier 5. – JYelton

+0

@JYelton - Non, il doesn ' t. Est uniquement valide dans SQL Server 2012 et ignore l'exigence «sans tri». –

10
  1. Vous devez compter le nombre de lignes à l'intérieur table (disons que nous avons 12 lignes)
  2. alors soustraire 5 lignes de leur part (nous sommes maintenant dans 7)
  3. sélectionnez * où index_column> 7

    select * from users 
    where user_id > 
    ((select COUNT(*) from users) - 5) 
    

    vous pouvez les commander ASC ou DESC

    Mais lorsque vous utilisez ce code

    select TOP 5 from users order by user_id DESC 
    

    il ne sera pas commandé facilement.

-1

Obtenez le comte de cette table

select count(*) from TABLE 
select top count * from TABLE where 'primary key row' NOT IN (select top (count-5) 'primary key row' from TABLE) 
2
select * from table limit 5 offset (select count(*) from table) - 5; 
2

5 derniers rangs extraient dans une base MySQL


Cette requête fonctionne parfaitement

SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC 

ou

select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc 
2

Dans SQL Server 2012, vous pouvez le faire:

Declare @Count1 int ; 

Select @Count1 = Count(*) 
FROM [Log] AS L 

SELECT 
    * 
FROM [Log] AS L 
ORDER BY L.id 
OFFSET @Count - 5 ROWS 
FETCH NEXT 5 ROWS ONLY; 
1

Lorsque le nombre de lignes dans le tableau est inférieur à 5 les réponses de Matt Hamilton et msuvajac est incorrect. Parce qu'une valeur TOP N rowcount peut ne pas être négative. Un excellent exemple peut être trouvé Here.

1

je suis en utilisant ce code:

select * from tweets where placeID = '$placeID' and id > (
    (select count(*) from tweets where placeID = '$placeID')-2) 
4

Recherche 5 enregistrements de derniers enregistrements que vous pouvez utiliser,

SELECT * 
FROM Table Name 
WHERE ID <= IDENT_CURRENT('Table Name') 
AND ID >= IDENT_CURRENT('Table Name') - 5 
0
DECLARE @MYVAR NVARCHAR(100) 
DECLARE @step int 
SET @step = 0; 


DECLARE MYTESTCURSOR CURSOR 
DYNAMIC 
FOR 
SELECT col FROM [dbo].[table] 
OPEN MYTESTCURSOR 
FETCH LAST FROM MYTESTCURSOR INTO @MYVAR 
print @MYVAR; 


WHILE @step < 10 
BEGIN 
    FETCH PRIOR FROM MYTESTCURSOR INTO @MYVAR 
     print @MYVAR; 
     SET @step = @step + 1; 
END 
CLOSE MYTESTCURSOR 
DEALLOCATE MYTESTCURSOR 
0

Essayez ceci, si vous ne disposez pas d'une clé primaire ou la même colonne:

select [Stu_Id],[Student_Name] ,[City] ,[Registered], 
     RowNum = row_number() OVER (ORDER BY (SELECT 0))  
from student 
ORDER BY RowNum desc 
Questions connexes