عند إعداد تقرير يشمل العملاء دون طلبات، يمكن البدء بجدول العملاء وربطه بالطلبات باستخدام LEFT JOIN. يبقى لكل عميل صف في ناتج الربط حتى إذا لم يجد طلبا مطابقا. لكن هذا الصف يحتوي على قيم مفقودة في أعمدة الطلب، وهو ما يؤثر في اختيار تعبير العد الصحيح.
مثال
SELECT c.id, COUNT(o.id) AS order_count
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.id
GROUP BY c.id;
إذا كان o.id مفتاحا أساسيا، فإن كل طلب حقيقي يملك قيمة معروفة فيه. لذلك يعده COUNT(o.id)، بينما يتجاهل الصف الذي أنشأه الربط لعميل بلا طلبات. النتيجة المطلوبة لذلك العميل هي صفر.
أما COUNT(*) فيعد صف الربط نفسه، وقد يعطي واحدا للعميل الذي لا يملك أي طلب. هذه ليست مشكلة في الدالة، بل نتيجة اختلاف الشيء الذي نعده: صفوف الربط مقابل سجلات الطلبات الحقيقية.
باختصار: بعد الربط الخارجي، عد مفتاح الجدول التابع غير القابل للفقد للحصول على عدد السجلات المطابقة.
هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.