2009-02-10 9 views
26

J'ai besoin, si possible, d'une requête t-sql qui, retournant les valeurs d'une table arbitraire, retourne également une colonne entière incrémentielle avec la valeur = 1 pour le première rangée, 2 pour la seconde, et ainsi de suite.Instruction MSSQL Select avec incrémental colonne entière ... pas d'une table

Cette colonne ne réside pas réellement dans une table, et doit être strictement progressive, parce que la clause ORDER BY pourrait trier les lignes de la table et je veux la ligne supplémentaire en parfaite forme toujours ...

Merci en avance.

--edit Désolé, oublié de mentionner, doit exécuter sur SQL Server 2000

Répondre

46

Pour SQL 2005 et

SELECT ROW_NUMBER() OVER(ORDER BY SomeColumn) AS 'rownumber',* 
    FROM YourTable 

pour 2000, vous devez faire quelque chose comme ça

SELECT IDENTITY(INT, 1,1) AS Rank ,VALUE 
INTO #Ranks FROM YourTable WHERE 1=0 

INSERT INTO #Ranks 
SELECT SomeColumn FROM YourTable 
ORDER BY SomeColumn 

SELECT * FROM #Ranks 
Order By Ranks 

voir aussi ici Row Number

+4

Ne pas oublier de déposer la table temporaire –

-1

Il est laid et joue mal, mais techniquement cela fonctionne sur une table avec au moins un champ unique et fonctionne SQL 2000.

SELECT (SELECT COUNT(*) FROM myTable T1 WHERE T1.UniqueField<=T2.UniqueField) as RowNum, T2.OtherField 
FROM myTable T2 
ORDER By T2.UniqueField 

note: Si vous utilisez cette approche et d'ajouter une clause WHERE à la SELECT externe, vous devez l'ajouter à la commande SELECT intérieure aussi si vous voulez que les numéros soient continu.

+0

Cela fonctionnera, mais comme vous l'avez déjà mentionné pour chaque ligne, il doit scanner toute la table, cela est également connu comme un compte courant – SQLMenace

+0

Ouais, c'est une solution majorly sucky. Cependant, sous la contrainte de SQL2K c'est soit ceci, soit la table temporaire (déjà proposée dans une autre réponse). Je suppose que cela dépend du scénario exact quelle solution est le moindre mal. – JohnFx

+0

Le scénario est: pour sélectionner plusieurs milliers de lignes d'une table: _ ( – Rodrigo

2

Vous pouvez commencer par un numéro de commande et l'incrément à partir de là, par exemple, vous souhaitez ajouter un numéro de chèque pour chaque paiement que vous pouvez faire:

select @StartChequeNumber = 3446; 
SELECT 
((ROW_NUMBER() OVER(ORDER BY AnyColumn)) + @StartChequeNumber) AS 'ChequeNumber' 
,* FROM YourTable 

donnera le numéro de chèque correct pour chaque ligne.

Questions connexes