SQL UNION y ORDER BY
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!
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