Pregunta

Tengo una instrucción SQL molesta que parece simple pero se ve horrible. Quiero que el sql devuelva un conjunto de resultados con datos de usuario ordenados para que cierto usuario sea la primera fila del conjunto de resultados si esa dirección de correo electrónico de usuarios está en la tabla de empresas.

Tengo este SQL que devuelve lo que quiero pero creo que se ve 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

Y, por cierto, la dirección de correo electrónico de la tabla de usuarios puede estar en muchas empresas, por lo que no puede haber una unión en la dirección de correo electrónico :-(

¿Tienes alguna idea de cómo mejorar esa afirmación?

Estoy usando Microsoft SQL Server 2000.

Editar: Estoy 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

Es mucho más elegante que el mío. Gracias Richard L!

¿Fue útil?

Solución

Podrías hacer algo como esto ...

        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

Otros consejos

¿funcionará esto ?:

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

No estoy seguro de que esto sea mejor, pero es un enfoque alternativo

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

Editar: si puede haber muchos correos electrónicos en diferentes compañías que coincidan, y usted solo está interesado en la compañía dada, esto se convierte en

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top