SQL UNION und ORDER BY
Frage
Ich habe eine lästige SQL-Anweisung, die einfach erscheinen, aber es sieht schrecklich. Ich mag, dass die SQL ein Resultset mit Benutzerdaten bestellt zurückzukehren, so dass ein bestimmte Benutzer die erste Zeile in der Ergebnismenge, wenn die Benutzer E-Mailadresse in der Firmen-Tabelle ist.
Ich habe diese SQL das zurückgibt, was ich will, aber ich denke, es sieht schrecklich:
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
Und übrigens, kann die E-Mailadresse aus der Benutzertabelle in vielen Unternehmen sein, so gibt es eine Join auf der E-Mailadresse sein kann nicht: - (
Haben Sie irgendwelche Ideen, wie diese Aussage zu verbessern?
Im mit Microsoft SQL Server 2000.
Edit: Im mit diesem:
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
Die Art und Weise eleganter als meine. Dank Richard L!
Lösung
Sie könnten etwas tun ..
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
Andere Tipps
wird diese Arbeit:?
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
Ich bin nicht sicher, das ist besser, aber es ist ein alternativer Ansatz
select *, (select count(*) from companies where email = u.email) as o
from users u
order by o desc
Edit: wenn es viele E-Mails über verschiedene Unternehmen sein kann, die passen, und Sie sind in der gegebenen Gesellschaft nur interessiert, dies wird
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