بناء جملة الاستعلام SQL: استخدام الاسم المستعار في الجدول في عدد غير صالح؟ لماذا ا؟

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

سؤال

هل يمكن لأحد أن يشرح لي لماذا الاستعلام التالي غير صالح؟ أقوم بتشغيل هذا الاستعلام مقابل قاعدة بيانات Oracle 10G.

select count(test.*) from my_table test;

أحصل على الخطأ التالي: ORA-01747: user user.table.column ، table.column ، أو مواصفات العمود

ومع ذلك, ، والاستعلامات التالية صالحة.

select count(test.column) from my_table test;

select test.* from my_table test;
هل كانت مفيدة؟

المحلول

COUNT(expression) سوف تحسب جميع الصفوف حيث expression هو ليس لاشيء. COUNT(*) هو استثناء ، فإنه يعيد عدد الصفوف: * ليس مستعار ل my_table.*.

نصائح أخرى

بقدر ما أعرف، Count(Table.*) لا يتم دعمه رسميًا في مواصفات SQL. فقط Count(*) (عد جميع الصفوف عاد) و Count(Table.ColumnName) (عد جميع القيم غير الفريدة في العمود المحدد). لذلك ، حتى لو دعمتها DBMS ، فإنني أوصي بعدم استخدامه.

هذا بناء الجملة يعمل فقط في PostgreSQL وفقط لأنه يحتوي على نوع بيانات تسجيل (من أجله test.* هو تعبير ذي معنى).

فقط استخدم COUNT(*).

هذا الاستعلام:

select count(test.column) from my_table test;

سيعود لك عدد السجلات التي test.column ليس NULL.

هذا الاستعلام:

select test.* from my_table test;

سيعود لك كل السجلات من my_table.

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

قد ترغب بشكل معقول في العثور على عدد السجلات التي لا يكون الاختبار. نظرًا لأن كل جدول يجب أن يحتوي على PK (وهو ليس فارغًا) ، يجب أن تكون قادرًا على حساب الصفوف مثل ذلك إذا كنت تريد:

select count(y.pk)
from x
left outer join y on y.pk = x.ck

إن Count (*) ليس جيدًا هنا لأن Join Outer هو إنشاء صف فارغ للجدول الذي يعاني من نقص في المعلومات.

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