web-dev-qa-db-fra.com

Instruction MSSQL Select avec une colonne entière incrémentielle ... pas d'une table

J'ai besoin, si possible, d'une requête t-sql qui, renvoyant les valeurs d'une table arbitraire, renvoie également une colonne entière incrémentielle avec valeur = 1 pour la première ligne, 2 pour la seconde, et ainsi de suite.

Cette colonne ne réside dans aucune table et doit être strictement incrémentielle, car la clause ORDER BY pourrait trier les lignes de la table et je veux toujours que la ligne incrémentielle soit en parfait état ...

Merci d'avance.

--EDIT Désolé, oublié de mentionner, doit fonctionner sur SQL Server 2000

34
Rodrigo

Pour SQL 2005 et supérieur

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 Numéro de ligne

57
SQLMenace

Vous pouvez commencer avec un numéro personnalisé et incrémenter à partir de là, par exemple, vous souhaitez ajouter un numéro de chèque pour chaque paiement que vous pouvez effectuer:

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

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

4

Essayez ROW_NUMBER ()

http://msdn.Microsoft.com/en-us/library/ms186734.aspx

Exemple:

SELECT
  col1,
  col2,
  ROW_NUMBER() OVER (ORDER BY col1) AS rownum
FROM tbl
2
Misko

Il est laid et fonctionne mal, mais techniquement, cela fonctionne sur n'importe quelle table avec au moins un champ unique ET fonctionne dans SQL 2000.

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

Remarque: Si vous utilisez cette approche et ajoutez une clause WHERE au SELECT externe, vous devez également l'ajouter au SELECT interne si vous souhaitez que les nombres soient continus.

0
JohnFx