10
votes

SQL d'avoir un enregistrement spécifique au sommet, tous les autres ci-dessous

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).

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?

J'utilise Oracle, au fait.


0 commentaires

6 Réponses :


2
votes

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


1 commentaires

Oracle ne supporte pas iif, mais vous pouvez décodage (ID, The_ID, 0,1)



8
votes

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


2 commentaires

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)



22
votes

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é.

Le deuxième champ de tri serait dûment_added afin que les enregistrements restants soient triés dans cette commande.

peur que je ne connaisse pas l'oracle par SQL Server, ce serait quelque chose comme xxx


2 commentaires

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 a une signification particulière dans Oracle, il triera sur la nième colonne. Bien sûr, il n'y a jamais une 0ème colonne. Avec le cas, il ajoutera une nouvelle colonne à chaque rangée et triera à ce sujet. La nouvelle colonne sera 1 pour la clé primaire correspondante et 0 partout ailleurs.



-1
votes

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.


1 commentaires

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é :-).



0
votes
SELECT *
FROM `Table`
ORDER BY (`id` = THE_ID) DESC, `date_added` DESC

0 commentaires

1
votes

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


0 commentaires