Instruction MSSQL Select avec 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émentale avec valeur = 1 pour la première ligne, 2 pour la seconde, et ainsi de suite.
Cette colonne ne réside pas réellement dans une table, et doit être strictement incrémentale, car la clause ORDER BY pourrait trier les lignes de la table et je veux toujours que la ligne incrémentale soit parfaite...
Merci d'avance.
-- modifier Désolé, j'ai oublié de mentionner, doit exécuter sur SQL Server 2000
4 réponses
Pour SQL 2005 et plus
SELECT ROW_NUMBER() OVER( ORDER BY SomeColumn ) AS 'rownumber',*
FROM YourTable
Pour 2000, vous devez faire quelque chose comme ceci
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
Vous pouvez commencer par un numéro personnalisé et incrémenter à partir de là, par exemple vous voulez 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 bon numéro de chèque pour chaque ligne.
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
C'est moche 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
Note: Si vous utilisez cette approche et ajoutez une clause WHERE à la sélection externe, vous devez également l'ajouter à la sélection interne si vous voulez que les nombres soient continus.