كيف أستخدم NOT EXISTS لاختيار من أكمل جميع المهام؟

متقدمقراءة دقيقةآخر تحديث 3 أكتوبر 2026

SQL قواعد البيانات

الإجابة

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

يجب أن يرتبط فحص الإكمال بالموظف والمهمة معًا. الربط بالموظف وحده يثبت أنه أكمل شيئًا، والربط بالمهمة وحدها يثبت أن شخصًا ما أكملها. لا يحقق أي منهما شرط إكمال كل مهمة بواسطة الموظف المحدد.

مثال

WITH employees AS (
  SELECT 1 AS id
), tasks AS (
  SELECT 10 AS id
), completions AS (
  SELECT 1 AS employee_id, 10 AS task_id
)
SELECT e.id FROM employees AS e
WHERE NOT EXISTS (
  SELECT 1 FROM tasks AS t
  WHERE NOT EXISTS (
    SELECT 1 FROM completions AS c
    WHERE c.employee_id = e.id AND c.task_id = t.id
  )
);

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

باختصار: التعبير عن «كل المهام» ممكن بنفي وجود أي مهمة تفتقر إلى سجل إكمال مرتبط بالموظف الحالي.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

أي شرط يكمل الاستعلام ليختار الموظفين الذين أكملوا كل مهمة، وفق completions(employee_id, task_id)؟

SELECT e.id
FROM employees AS e
WHERE NOT EXISTS (
  SELECT 1 FROM tasks AS t
  WHERE NOT EXISTS (
    SELECT 1 FROM completions AS c
    WHERE /* ضع الشرط هنا */
  )
);