2016-10-08 1 views
0

Je suis sûr que c'est facile mais j'ai beaucoup cherché et googlé.Nouvelles rangées de SQL Server

Ok, j'ai une table SANS les dates etc avec 100000000000000000 enregistrements.

Je veux voir les dernières entrées, à savoir

Select top 200 * 
from table 

mais je veux voir les dernières entrées. Y a-t-il un rowidentifier que je pourrais utiliser dans une table?

-à-dire

select top 200 * 
from table 
order by rowidentifer Desc 

Merci

+2

Non. Il n'y a pas de commande dans un tableau. – dnoeth

+0

Il est pratiquement impossible d'avoir une table avec 100 000 000 000 000 000 lignes. Si vous le faites, vous devriez avoir un assez bon DBA que vous pouvez parler. –

+2

Oui. Compléter BS. même si chaque rangée était minuscule à 14 octets ce qui serait 1400 pétaoctets de stockage pour la table. –

Répondre

-1

Nope, en bref, il n'y en a pas, si vous ne possédez pas une colonne dédiée comme une (ie. Une identité, ou une séquence, ou quelque chose de similaire). Si vous l'avez fait, vous pourriez obtenir un résultat ordonné.

0

Y at-il un row.identifier que je pouvais utiliser dans une table-à-dire 200 * Set Top de l'ordre de table par row.identifer Desc

Comme indiqué dans le commentaire de, il n'y a pas. Le meilleur moyen est d'avoir une identité, un horodatage ou une autre forme d'identification de l'enregistrement. Voici une autre façon d'utiliser EXCEPT pour obtenir ce dont vous avez besoin, mais le plan d'exécution n'est pas le meilleur ... Jouez avec et changez au besoin.

 --testing purposes... 
DECLARE @tbl TABLE(FirstName VARCHAR(50)) 
DECLARE @count INT = 0 

WHILE (@count <= 12000) 
BEGIN 
    INSERT INTO @tbl(FirstName) 
    SELECT 
     'RuPaul ' + CAST(@count AS VARCHAR(5)) 

    SET @count += 1 

END 

--adjust how many records you would like, example is 200 
SELECT * 
FROM @tbl 
EXCEPT(SELECT TOP (SELECT COUNT(*) - 200 FROM @tbl) * FROM @tbl) 

--faster than above 
DECLARE @tblCount AS INT = (SELECT COUNT(*) FROM @tbl) - 200 
SELECT * 
FROM @tbl 
EXCEPT(SELECT TOP (@tblCount) * FROM @tbl) 

Sur une autre note, vous pouvez créer une autre Table Variable qui a une carte d'identité et d'autres colonnes, vous pouvez insérer les enregistrements dont vous auriez besoin. Ensuite, vous pouvez effectuer d'autres opérations sur la table, par exemple OrderBy etc ...

Qu'est-ce que vous pourriez faire

ALTER TABLE TABLENAME 
ADD ID INT IDENTITY 

Cela va ajouter une autre colonne à la table « ID » et donner automatiquement c'est un identifiant. Alors vous avez un identifiant que vous pouvez utiliser ...

0

Ceci n'est pas vraiment une réponse à la question. C'est juste que je me demandais si %%physloc%% pouvait être utilisé pour cela.

Mais non.
Vous avez vraiment besoin d'un champ date-heure de création, ou d'un champ rempli séquentiel pour cela.

C'est le test:

create table Test (id int identity(1,1) primary key, var1 varchar(20), creation_date datetime default SYSDATETIME()); 

declare @T table (c char(1)); 

insert into @T (c) values 
('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z'); 

insert into Test (var1) select concat(t1.c,t2.c,t3.c) as text from @T t1, @T t2, @T t3 order by 1; 

select top 10 *, %%physloc%% as physloc from Test order by %%physloc%% desc; 

select top 10 * from Test order by id desc; 

Les 2 dossiers différents sélectionne le retour, donc %%physloc%% ne peut pas être utilisé pour cela.