J'essaie de mettre en place une requête qui affichera un enregistrement spécifique (trouvé par l'identifiant principal de l'enregistrement) en haut et affiche tous les autres enregistrements ci-dessous, triés par date (j'ai "Date_added" comme l'un des champs dans la table, en plus de l'ID primaire). P>
Je pourrais faire cela avec un syndicat (premier choix localiserait l'enregistrement que je souhaite, et l'autre sélection afficherait tous les autres enregistrements), mais je me demande si y a-t-il peut-être une meilleure façon? P>
J'utilise Oracle, au fait. P>
6 Réponses :
Je ne connais pas l'oracle exactement, mais vous pourriez peut-être faire quelque chose comme ..
ORDER BY IF(id == THE_ID, 0, 1), date_added
Oracle ne supporte pas iif, mais vous pouvez décodage (ID, The_ID, 0,1) code>
Un moyen plus facile serait un ordre de fantaisie par construction. Voici un exemple pour PK = 123:
select * from YourTable order by case when yourpk = 123 then 1 else 2 end, date_added
Cela mettrait l'enregistrement spécifique à la fin, devrait être "... puis 1 autre 2 fin ..."
@Ammoq: Merci, Réponse modifiée (REKO_T a publié la même idée précédente Tho)
Vous pouvez le faire en tri par deux champs
le premier serait une expression qui retourne 0 si la ligne est celle que vous voulez ou 1 si ce n'est pas le cas. Trier sera ascendant de sorte que vous obtiendrez d'abord votre enregistrement préféré. P>
Le deuxième champ de tri serait dûment_added afin que les enregistrements restants soient triés dans cette commande. P>
peur que je ne connaisse pas l'oracle par SQL Server, ce serait quelque chose comme p>
Merci d'avoir répondu. Que signifie "commander par 0", au fait? J'ai remarqué que je ne peux pas utiliser cela par lui-même, par exemple seulement "ordre de 0". (Je reçois l'erreur: "La commande par article doit être le numéro d'une expression sélectionnée")
Commander par
La manière simple serait de reconnaître que vous souhaitez afficher deux choses distinctes et donc écrire dans des requêtes simples séparées. Une requête pour récupérer le premier enregistrement et la seconde pour récupérer la liste triée. Il n'y a pas d'avantage de performance réel à faire quelque chose de plus que cela en raison d'un enregistrement unique. P>
Oui, mais il y a des avantages de le faire comme une seule déclaration SQL. Certains environnements (par exemple, des suites de reporting) ne permettent pas une réutilisation facile des constructions SQL, il peut donc avoir à répéter la majeure partie du SQL deux fois, qui est problématique pour la maintenance. De plus, le faire en SQL est plus consulté :-).
SELECT * FROM `Table` ORDER BY (`id` = THE_ID) DESC, `date_added` DESC
Vous pouvez trier plus d'un enregistrement sur le dessus en utilisant la même technique
999 d'abord 998 secondes suivi de tout le reste trié par date p>
SELECT * P>
from the_table order by (case id when 999 then 0 when 998 then 1 else 2 end), date_added desc