البحث عن عميل بلا طلب مدفوع يختلف عن البحث عن عميل لديه طلب غير مدفوع. فقد يملك العميل طلبا مدفوعا وآخر معلقا في الوقت نفسه. وجود الطلب المعلق لا يثبت غياب الطلب المدفوع، ولذلك لا يكفي اختيار الصفوف التي تكون حالتها مختلفة عن paid.
الحل باستخدام الربط هو جعل الطرف المرتبط يمثل الطلبات المدفوعة فقط. نضع شرط الحالة داخل ON إلى جانب علاقة العميل، ثم نبحث عن غياب مفتاح الطلب. بهذه الصياغة يظهر العميل الذي لا يملك طلبات، وكذلك العميل الذي يملك طلبات ولكن لا يوجد بينها أي طلب مدفوع.
مثال
SELECT c.id
FROM customers AS c
LEFT JOIN orders AS o
ON o.customer_id = c.id
AND o.status = 'paid'
WHERE o.id IS NULL;
نفترض أن معرّف الطلب مفتاح أساسي. إذا وجد طلب مدفوع واحد أو أكثر، فلن ينتج للعميل صف غير مطابق، ولذلك تستبعده عبارة التصفية مهما كانت طلباته الأخرى.
باختصار: اربط بالفئة التي تريد إثبات غيابها، ثم اختبر عدم وجود صف مطابق منها.
هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.