SQL UNION et ORDER BY
Question
J'ai une instruction SQL agaçante qui semble simple mais qui a l’air moche. Je souhaite que SQL renvoie un jeu de résultats avec les données utilisateur commandées, de sorte qu'un utilisateur donné soit la première ligne du jeu de résultats si l'adresse de messagerie de cet utilisateur figure dans le tableau des sociétés.
J'ai ce SQL qui retourne ce que je veux mais je pense que ça a l'air horrible:
select 1 as o, *
from Users u
where companyid = 1
and email = (select email from companies where id=1)
union
select 2 as o, *
from Users u
where companyid = 1
and email <> (select email from companies where id=1)
order by o
Et au fait, l'adresse de messagerie de la table des utilisateurs peut figurer dans de nombreuses entreprises, de sorte qu'il ne peut y avoir de jointure sur l'adresse de messagerie: - (
Avez-vous des idées pour améliorer cette affirmation?
J'utilise Microsoft SQL Server 2000.
Modifier: J'utilise celui-ci:
select *, case when u.email=(select email from companies where Id=1) then 1 else 2 end AS SortMeFirst
from Users u
where u.companyId=1
order by SortMeFirst
Son chemin plus élégant que le mien. Merci Richard L!
La solution
Vous pouvez faire quelque chose comme ça ..
select CASE
WHEN exists (select email from companies c where c.Id = u.ID and c.Email = u.Email) THEN 1
ELSE 2 END as SortMeFirst, *
From Users u
where companyId = 1
order by SortMeFirst
Autres conseils
cela fonctionnera-t-il?:
select c.email, *
from Users u
LEFT JOIN companies c on u.email = c.email
where companyid = 1
order by c.email desc
-- order by case when c.email is null then 0 else 1 end
Je ne suis pas sûr que ce soit mieux, mais c'est une approche alternative
select *, (select count(*) from companies where email = u.email) as o
from users u
order by o desc
Modifier: s'il peut y avoir beaucoup de courriels correspondant à différentes entreprises et que vous n'êtes intéressé que par celle-ci, cela devient
select *,
(select count(*) from companies c where c.email = u.email and c.id = 1) as o
from users u
where companyid = 1
order by o desc