Pergunta

Eu tenho uma instrução SQL irritante que parece simples, mas parece awfull. Eu quero o sql para retornar um conjunto de resultados com userdata ordenou para que um determinado usuário é a primeira linha no conjunto de resultados se que os usuários emailAddress está na tabela de empresas.

Eu tenho esse SQL que retorna o que eu quero, mas eu acho que parece terrível:

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

E, a propósito, o endereço de email da tabela de usuário pode estar em muitas empresas por isso não posso ser uma junção na emailaddress: - (

Você tem alguma idéia de como melhorar essa afirmação?

Im usando o Microsoft SQL Server 2000.

Edit: Im usando este:

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

A sua maneira mais elegante do que a minha. Graças Richard L!

Foi útil?

Solução

Você poderia fazer algo assim ..

        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

Outras dicas

este trabalho:?

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

Eu não estou certo de que este é melhor, mas é uma abordagem alternativa

select *, (select count(*) from companies where email = u.email) as o 
from users u 
order by o desc

Edit: se não pode haver muitos e-mails através de diferentes empresas que jogo, e você está interessado apenas na empresa dada, isso se torna

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top