SET @LatestRowNum = 2; WITH OrderedOrders AS ( SELECT ROW_NUMBER() OVER(order by ID desc) AS Rownum, * FROM someTable WITH(NOLOCK) ORDER BY ID DESC ) SELECT * FROM OrderedOrders WHERE Rownum = @LatestRowNum
La requête ci-dessus me lance
Msg 1033, niveau 15, état 1, ligne 17 La clause ORDER BY n'est pas valide dans les vues, les fonctions inline, les tables dérivées, les sous-requêtes et les expressions de table communes, sauf si TOP, OFFSET ou FOR XML est également spécifié.
Comment atteindre l'objective selon lequel j'attends parfois les derniers loggings ou parfois les deuxièmes derniers loggings?
Vous n'avez pas besoin de clause interne ORDER
puisque vous utilisez la clause ORDER
dans ROW_NUMBER()
.
Essaye ça
SET @LatestRowNum = 2; WITH OrderedOrders AS ( SELECT ROW_NUMBER() OVER(order by ID desc) AS Rownum,* FROM someTable WITH(NOLOCK) ) SELECT * FROM OrderedOrders WHERE Rownum = @LatestRowNum
Bien que la command ne soit pas nécessaire autre que row_number si un seul logging est renvoyé par la requête. mais vous pouvez essayer d'append un mot key TOP
. Notez que TOP 100 PERCENT
ne fonctionne pas. vous pouvez essayer d'append TOP 9999999
(maximum) nombre possible.
En outre, certains commentaires dans OP suggèrent qu'il n'est pas nécessaire d'append une command en raison de ORDER BY
dans ROW_NUMBER
mais ROW_NUMBER
ne command pas toujours les lignes (reference: https://msdn.microsoft.com/en-in/library/ms186734.aspx . Remarques générales).
Il n'y a aucune garantie que les lignes renvoyées par une requête utilisant ROW_NUMBER () seront commandées exactement de la même manière à chaque exécution
Vous pouvez vous référer à quelques articles utiles:
http://blog.sqlauthority.com/2010/08/23/sql-server-order-by-does-not-work-limitation-of-the-views-part-1/
Créer une vue avec la clause ORDER BY
Modifier:
l'autre solution utilise une variable au lieu de constante dans le mot key TOP
. par exemple TOP (@T) PERCENT
.
declare @t as tinyint = 100 declare @tbl as table (num1 int,num2 int) insert into @tbl values (7,1),(2,7),(4,6),(6,4), (7,1),(2,7),(4,6),(6,4) select * from(select top 100 percent * from @tbl order by num1) t select * from(select top (@t) percent * from @tbl order by num1) t
Dans l'exemple ci-dessus, la dernière requête donne le résultat attendu. S'il y a une variable dans le mot-key TOP, le SQL suppose qu'il pourrait y avoir une valeur donc il la considérera toujours au lieu de l'ignorer.