2017-09-08 7 views
0

Je suis curieux de résoudre ce problème depuis des jours maintenant, et je viens d'identifier la source de mes malheurs - une clause order by ne fonctionne pas comme prévu.T-SQL Ordre par - la priorité du type de données ne fonctionne pas comme prévu

Le script va comme ceci:

select * from my_table 
order by change_effective_date, unique_id desc 

change_effective_date est un champ datetime et id_unique est un champ int.

Je m'attendais à ce que cela me donne la rangée la plus récente en premier (c'est-à-dire la rangée avec la valeur la plus élevée dans change_effective_date). Cependant, il donnait la ligne la plus ancienne en premier, et l'identifiant unique_id était également en ordre croissant (ces identifiants sont normalement séquentiels, donc je m'attendrais généralement à ce qu'ils suivent le même ordre que les dates, bien que ce ne soit pas complètement fiable).

Perplexe, je me suis tourné vers Google et a constaté que la priorité du type de données peut affecter l'ordre par des clauses, avec des types de données de rang inférieur étant convertis dans le type de rang supérieur: https://blog.sqlauthority.com/2010/10/08/sql-server-simple-explanation-of-data-type-precedence/

Cependant, datetime a la priorité sur int, donc il ne devrait pas être affecté de cette manière.

Plus curieusement, si je supprime unique_id de la clause order by, il trie parfaitement les données dans l'ordre décroissant des dates. Je souhaite cependant ajouter un identifiant unique à la clause order by, car il pourrait y avoir plusieurs lignes avec la même date et plus loin dans le script que je veux identifier le plus récent (dans ce cas, l'unique_id serait le lien -breaker car je suppose que c'est séquentiel).

Si quelqu'un peut expliquer ce qui se passe ici, je l'apprécierais vraiment!

Merci.

Répondre

2
select * from my_table 
order by change_effective_date desc, unique_id desc 
+0

Merci! A travaillé un régal. Je ne peux pas croire que je ne le savais pas (et je me demande quel autre "ordre par" mésaventures se cachent dans les scripts que j'ai écrit dans le passé ....). Quelqu'un sait si cela s'applique également à Oracle? –

+1

Il devrait afaik – muasif80

+1

@ s.turn Oui. C'est la même chose dans Oracle aussi. –