2014-06-07 2 views
1

j'ai cette requêterésultats corrects, mais dans un ordre différent dans SQL

select s.emp_no, min(s.from_date) 
from 
**start** (select s.emp_no 
from salaries s, employees e 
where s.to_date=(select max(to_date) from salaries) and s.emp_no=e.emp_no 
group by s.salary DESC 
LIMIt 10) **end** as emps, salaries s 
where emps.emp_no=s.emp_no 
group by s.emp_no; 

Le début - fin partie est correcte. Comme vous pouvez le voir, il n'y a qu'un seul champ qui contient le numéro de l'employé. L'emp_no est la clé étrangère aux salaires de la table. Le salaire de table a 2 champs. L'emp_no et le from_date. Chaque emp_no peut avoir plusieurs valeurs from_date. Je veux grouper toutes les lignes de chaque emp_no des salaires et garder le min de date_value. Cela montre corrige les résultats (je suppose), mais modifie l'ordre des lignes créées au début partie. Des idées sur le maintien de la commande?

+1

Vous devrez peut-être ajouter un échantillon et un résultat souhaité, mais si vous souhaitez une commande spécifique, vous devrez également la commander dans la requête externe. Toute requête externe non ordonnée exécutée sur le résultat d'une sous-requête ordonnée réorganisera potentiellement le résultat dans un ordre pseudo-aléatoire. –

+0

Alors, comment puis-je garder l'ordre de l'extérieur tel qu'il est dans l'intérieur? –

+0

Pour répondre à cette question, vous aurez besoin d'ajouter des exemples de données et un résultat souhaité, il n'est pas très clair comment vous voulez un résultat groupé par quelque chose pour commander exactement comme le résultat d'origine. –

Répondre

2

Vous n'avez pas de clause ORDER BY. Sans clause ORDER BY, vous ne pouvez pas vous attendre à ce que votre jeu de résultats ait un ordre spécifique. Si vous voulez que vos données sortent dans un ordre spécifique, vous devez le commander de cette façon. Cela peut signifier calculer une colonne dans l'expression de votre table interne pour vous permettre de commander correctement le jeu de résultats externe. . Comment vous obtenez en fait la commande dépend de vos données et quel ordre vous avez besoin d'être dans

Pour plus d'informations, voir:

Le concept difficile est ce. Les spécifications SQL indiquent que l'ordre des lignes de l'ensemble de résultats est imprévisible à moins d'être complètement déterminé par une clause ORDER BY. Cette imprévisibilité est un concept difficile à travailler. Si vous omettez les spécifications ORDER BY appropriées de votre requête, vos lignes parfois, mais pas toujours apparaissent dans l'ordre que vous attendez. Souvent, la commande change lorsque vous déplacez votre application d'un développement à un serveur de production. Pire encore, il peut changer après des mois de production quand une table de votre serveur de production dépasse un seuil de taille. S'il te plait fais attention.

+2

C'est vrai. Parfois, *** mais pas toujours ***, un effet secondaire involontaire de 'GROUP BY' est de placer le résultat dans un ordre particulier. –

+0

Cela peut être vrai, mais pourquoi vous fiez-vous à des conséquences inattendues et non documentées lorsque vous pourriez explicitement déclarer que vous avez besoin que les résultats soient ordonnés d'une manière spécifique? Il y a tellement de façons qui pourraient s'effondrer que je ne pourrais pas recommander à quiconque d'utiliser ces techniques. –

+1

Précisément. Mon point est ceci: preuve d'un serveur de développement que "les choses fonctionnent" est pire qu'inutile. Une application dont le code ORDER BY est incorrect ou manquant peut fonctionner correctement sur un petit serveur de développement et s'effondrer lorsqu'elle est déplacée vers un environnement de production.Pire encore, il peut s'effondrer d'un an à la production quand une table franchit un seuil de taille. J'ai vu les deux. "Parfois, mais pas toujours", aussi connu comme "imprévisible", est un concept difficile à saisir dans la pratique. –

Questions connexes