ОБЪЕДИНЕНИЕ SQL и ПОРЯДОК ПО
Вопрос
У меня есть раздражающий оператор SQL, который кажется простым, но выглядит ужасно.Я хочу, чтобы sql возвращал результирующий набор с пользовательскими данными, упорядоченными таким образом, чтобы определенный пользователь был первой строкой в результирующем наборе, если адрес электронной почты этого пользователя находится в таблице companies.
У меня есть этот SQL, который возвращает то, что я хочу, но я думаю, что это выглядит ужасно:
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
И, кстати, адрес электронной почты из таблицы user может быть во многих компаниях, поэтому в адресе электронной почты не может быть соединения :-(
Есть ли у вас какие-либо идеи, как улучшить это утверждение?
Я использую Microsoft SQL Server 2000.
Редактировать:Я использую этот:
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
Его способ более элегантный, чем мой.Спасибо, Ричард Л.!
Решение
Вы могли бы сделать что-то вроде этого..
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
Другие советы
сработает ли это?:
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
Я не уверен, что это лучше, но это альтернативный подход
select *, (select count(*) from companies where email = u.email) as o
from users u
order by o desc
Редактировать:если может быть много совпадающих электронных писем от разных компаний, и вас интересует только данная компания, это становится
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