الخلية: استخدام اسم مستعار الحقول في دالات التجميع

StackOverflow https://stackoverflow.com/questions/372961

سؤال

ولدي بيان SQL مشابهة لهذه:

SELECT COUNT(*) AS foo, SUM(foo) AS foo_sum FROM bar

ولكن الخلية لا يسمح هذا لفو هو اسم مستعار. هل لديها فكرة عن الكيفية التي يمكن بها تحقيق ذلك في SQL؟

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

المحلول

لا، لا يمكنك استخدام اسم مستعار في القائمة حدد أو جملة WHERE. يمكنك فقط استخدام الاسم المستعار في GROUP BY، بعد، أو ORDER BY.

ويمكنك أيضا استخدام الأسماء المستعارة المحددة في فرعي:

SELECT foo, SUM(foo) AS foo_sum
FROM (
  SELECT COUNT(*) AS foo
  FROM bar
);

نصائح أخرى

SELECT SUM(foo) as foo_sum
FROM 
(
    SELECT COUNT(*) AS foo
    FROM bar
    GROUP BY baz
)

واعتقد انها ليست فكرة جيدة. إذا كنت تريد أن تجعل استعلام كبيرة، فمن الأفضل أن تفعل ذلك دون استعلام فرعي. استخدام COUNT(*) وظائف أكبر دون اسم مستعار، إذا كنت في حاجة إليها.

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

وأنا لا أعرف ما تحاول القيام به ولكن مع الحلول السابقة كنت تقوم بتشغيل فرعي على الجدول الاسم المستعار وهي ليست فعالة.

SELECT foo 
FROM (SELECT COUNT(*) AS foo FROM employees) AS T;

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

والجواب البسيط على أي حال:

SELECT Count(1) AS foo from employees;

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top