Вопрос

У меня есть раздражающий оператор 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top