Fonction SQL Row Number() dans la Clause Where sans ORDER BY?

J'ai trouvé un tas de questions sur ce sujet avec de belles solutions, mais aucun d'eux de quoi faire si les données ne doit pas être commandé dans une manière spécifique. Par exemple, la requête suivante:

WITH MyCte AS 
(
    select   employee_id,
             RowNum = row_number() OVER ( order by employee_id )
    from     V_EMPLOYEE 
    ORDER BY Employee_ID
)
SELECT  employee_id
FROM    MyCte
WHERE   RowNum > 0

Fonctionne bien si les données doivent être commandés par employee_id. Mais que se passe-t-il si mes données n'ont pas d'ordre spécifique mais que les numéros de ligne eux-mêmes agissent comme un identifiant? Mon but est d'écrire une requête comme celle-ci (avec la fonction Row_Number() n'ayant pas de clause ORDER BY):

WITH MyCte AS 
(
    select   employee_id,
             RowNum = row_number() OVER ( <PRESERVE ORIGINAL ORDER FROM DB> )
    from     V_EMPLOYEE 
    ORDER BY Employee_ID
)
SELECT  employee_id
FROM    MyCte
WHERE   RowNum > 0

Modifier: sur Googling, j'ai compris que ce n'est pas vraiment possible. Certains suggèrent une solution pour cela?

41
demandé sur Adrian Carneiro 2011-06-17 22:35:55

5 réponses

Juste au cas où cela serait utile à quelqu'un d'autre. Je viens de le comprendre de ailleurs :

WITH MyCte AS 
(
    select   employee_id,
             RowNum = row_number() OVER (ORDER BY (SELECT 0))
    from     V_EMPLOYEE 
    ORDER BY Employee_ID
)
SELECT  employee_id
FROM    MyCte
WHERE   RowNum > 0
92
répondu Legend 2016-10-13 09:03:48

J'utilise ceci pour supprimer le tri:

ORDER BY @@rowcount

@@rowcount est constant dans la requête. Exemple:

select N = row_number() over (order by @@rowcount) from sys.columns

L'utilisation de (select 0) dans L'ordre Par semble fonctionner beaucoup plus lentement.

21
répondu kaborka 2013-04-26 17:19:45

Le vrai problème avec l'approche que vous proposez est que l'ordre dans la base de données n'est pas garantie. Par coïncidence, il peut revenir à votre application dans le même ordre tout le temps, mais la norme SQL ne garantit pas un tel ordre et peut changer en fonction des changements de version ou d'édition. L'ordre des données D'un serveur SQL N'est pas garanti sans une clause order by. Cette conception serait celle qui repose simplement sur ' Chance."Si cette variation possible dans l'ordre a un impact sur votre implémentation, vous voudrez peut-être le changer maintenant avant d'aller trop loin dans l'implémentation.

Bon article sur ce sujet

6
répondu doug_w 2011-06-17 18:54:43

Il n'y a pas de commande originale. SQL server ne peut pas garantir l'ordre des lignes si vous ne spécifiez pas ORDER BY. Vous pouvez avoir de la chance et obtenir des résultats dans un ordre particulier, mais cela peut changer à tout moment.

4
répondu Tomas Kirda 2011-06-17 18:44:47

Il y a une solution qui est plus simple que ci-dessus. Vous pouvez toujours utiliser ROW_NUMBER mais fournir une valeur arbitraire dans la clause Order by:

Select firstName, lastName, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) from tblPerson
1
répondu Zphunk 2017-08-03 19:21:52