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

28
demandé sur Cade Roux 2009-02-11 00:16:44

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

49
répondu SQLMenace 2009-02-10 21:26:11

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.

4
répondu Israel Margulies 2013-05-01 16:13:27

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
répondu Misko 2009-02-10 21:19:57

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.

-1
répondu JohnFx 2009-02-10 21:34:14