سؤال

ولدي بيان SQL مزعج التي تبدو بسيطة ولكن يبدو أوفول. أريد مزود لإرجاع resultset ومع بيانات المستخدمين أمر بحيث مستخدم معين هو الصف الأول في resultset إذا أن المستخدمين EMAILADDRESS في الجدول الشركات.

ولدي هذا 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

وبالمناسبة، فإن EMAILADDRESS من الجدول المستخدم يمكن أن يكون في كثير من الشركات لذلك لا يمكن أن يكون هناك الانضمام على EMAILADDRESS: - (

هل لديك أي أفكار كيفية تحسين هذا البيان؟

وايم تستخدم 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

وسيلة لها أكثر أناقة من الألغام. بفضل ريتشارد L!

هل كانت مفيدة؟

المحلول

هل يمكن أن تفعل شيئا من هذا القبيل ..

        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