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!

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top