SQL UNION и ORDER BY - PullRequest
       27

SQL UNION и ORDER BY

0 голосов
/ 28 января 2009

У меня есть раздражающий SQL-оператор, который кажется простым, но выглядит ужасно. Я хочу, чтобы sql возвращал набор результатов с пользовательскими данными, упорядоченными так, чтобы определенный пользователь был первой строкой в ​​наборе результатов, если адрес электронной почты этого пользователя находится в таблице компаний.

У меня есть этот 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

И, кстати, адрес электронной почты из таблицы пользователей может быть во многих компаниях, поэтому на адресе электронной почты не может быть соединения: - (

У вас есть идеи, как улучшить это утверждение?

Я использую Microsoft SQL Server 2000.

Edit: Я использую это:

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

Он более элегантный, чем мой. Спасибо Ричард Л!

Ответы [ 3 ]

6 голосов
/ 28 января 2009

Вы могли бы сделать что-то вроде этого ..

        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
5 голосов
/ 28 января 2009

это будет работать?:

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
1 голос
/ 28 января 2009

Я не уверен, что это лучше, но это альтернативный подход

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
...