SQL fonction Row_Number() dans la Clause where sans ORDONNANCE PAR?
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 faire si mes données ne disposent pas d'ordre précis, mais les numéros des lignes elles-mêmes agissent comme un ID? Mon but est d'écrire une requête comme ceci (avec le Row_Number()
fonction ayant pas de ORDER BY
clause):
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
EDIT: Après recherche sur Google, j'ai compris que ce n'est pas vraiment possible. Certains suggèrent une solution pour cela?
- Sauf si vous avez explicitement
ORDER BY
clause, il est PAS implicite de la commande (il n'est pas "d'origine afin de DB") dans un environnement SQL Server - Je vous remercie. Juste pour clarifier, voulez-vous dire, dans une petite base de données de dire, 20000 dossiers, il ne permet pas de conserver l'ordre d'insertion (même si il n'y a pas insertions simultanées)?
- Vous êtes de droite. Même pendant séquentielle insère, il ne conserve pas l'ordre. C'est très différent de mon MySQL expérience. Merci pour le heads up!
Vous devez vous connecter pour publier un commentaire.
Juste au cas où il est utile à quelqu'un d'autre. Je viens de comprendre, à partir d'ailleurs:
V_EMPLOYEE
par un ordre dérivé de la table: stackoverflow.com/q/18961789/521799(ORDER BY (SELECT 0))
signifie vraiment?Je l'utilise pour supprimer le tri:
@@rowcount est constante à l'intérieur de la requête. Exemple:
Utilisation de (sélectionnez 0) dans l'ORDRE semble fonctionner beaucoup plus lentement.
Le vrai problème avec l'approche que vous proposez est que l'ordre dans la base de données n'est pas garantie. Il peut par coïncidence être de retour à votre demande dans le même ordre tous les temps, mais le Standard SQL ne garantit pas à l'ordre et peut changer en fonction de la version ou les modifications 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 s'appuie tout simplement sur la chance.' Si cette variation possible de l'ordre a un impact sur votre application, vous pouvez le changer maintenant, avant d'aller trop loin dans la mise en œuvre.
Bon article sur ce sujet
Il n'y a pas une telle chose comme la COMMANDE d'ORIGINE. SQL server ne peut pas garantir l'ordre des lignes si vous ne spécifiez pas de COMMANDE PAR. Vous pouvez avoir de la chance et obtenir des résultats dans un ordre particulier, mais il peut changer à tout moment.
Il y a une solution qui est plus simple que ci-dessus. Vous pouvez toujours utiliser la fonction ROW_NUMBER, mais l'offre d'une valeur arbitraire dans la clause Order by: