سؤال

وأنا مستخدم الخلية الذي يحاول ميناء بعض الأمور إلى MS SQL خادم.

وأنا الانضمام إلى اثنين من الجداول، وتجميع بعض الأعمدة عن طريق GROUP BY.

وهناك مثال بسيط سيكون الموظفين والمشاريع:

select empID, fname, lname, title, dept, count(projectID)
from employees E left join projects P on E.empID = P.projLeader
group by empID

... التي من شأنها العمل في الخلية، ولكن MS SQL هو أكثر صرامة ويتطلب أن كل شيء إما موضوعة في وظيفة الكلية أو هو جزء من جملة GROUP BY.

وذلك، بالطبع، في هذا المثال البسيط، وأفترض أنني يمكن أن تشمل فقط أعمدة إضافية في المجموعة من قبل الشرط. لكن الاستعلام الفعلي أتعامل مع معقد جدا، ويتضمن مجموعة من العمليات التي تجرى على بعض الأعمدة غير المجمعة ... أي أن لها الحصول على القبيح حقا في محاولة لتشمل كل منهم في المجموعة التي بند .

وحتى لا يكون هناك طريقة أفضل للقيام بذلك؟

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

المحلول

ويمكنك الحصول عليه للعمل مع شيء حول هذه الخطوط:

select e.empID, fname, lname, title, dept, projectIDCount
from
(
   select empID, count(projectID) as projectIDCount
   from employees E left join projects P on E.empID = P.projLeader
   group by empID
) idList
inner join employees e on idList.empID = e.empID

وبهذه الطريقة يمكنك تجنب مجموعة إضافية من العمليات، ويمكنك الحصول على أي البيانات التي تريدها. أيضا لديك فرصة أفضل للاستفادة جيدة من الفهارس على بعض السيناريوهات (إذا كنت لا يرجع معلومات كاملة)، ويمكن الجمع بين أفضل مع ترحيل الصفحات.

نصائح أخرى

و"سيكون من الحصول على القبيح حقا في محاولة لتشمل كل منهم في المجموعة التي الشرط."

ونعم - هذه هي الطريقة الوحيدة للقيام بذلك * - مجرد نسخ ولصق الأعمدة غير المجمعة في مجموعة من شرط، وإزالة الأسماء المستعارة وهذا امر جيد كما يحصل ...

* هل يمكن أن التفاف عليه في SELECT متداخلة ولكن هذا ربما مثلما قبيحة ...

والخلية هي غير عادية - وتقنيا لا تتوافق مع معيار SQL - في السماح لك بحذف العناصر من GROUP BY جملة. في SQL القياسية، يجب أن يتم سرد كل عمود غير الكلي في القائمة المختارة بالكامل في GROUP BY الفقرة (إما بالاسم أو رقم ترتيبي، ولكن هذا هو مستنكر).

و(أوه، على الرغم من أن الخلية هي غير عادية، فمن الجميل أن يسمح للاختزال).

وأنت لا تحتاج الانضمام في فرعي كما ليس من الضروري لجعل مجموعة التي تتخذ على empID من الموظفين - يمكنك أن تفعل ذلك في مجال projectLeader من المشاريع.

ومع انضمام الى الداخلية (كما أضع) ستحصل على قائمة الموظفين التي لديها مشروع واحد على الأقل. إذا كنت تريد قائمة بأسماء جميع الموظفين فقط تغييره إلى اليسار انضمام

  select e.empID, e.fname, e.lname, e.title, e.dept, p.projectIDCount
    from employees e 
   inner join ( select projLeader, count(*) as projectIDCount
                  from projects
                 group by projLeader
              ) p on p.projLeader = e.empID

وA فرعي في جملة SELECT يمكن أيضا أن تكون مناسبة. وسيكون العمل على سبيل المثال تعطى ولكن قد لا للاستعلام معقدة الفعلي الذي تتعامل معه.

select
        e.empID, fname, lname, title, dept
        , (select count(*) from projects p where p.projLeader = e.empId) as projectCount
from
   from employees E
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top