كيف أختار أعلى راتب في كل قسم باستخدام NOT EXISTS مع الحفاظ على التعادل؟

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

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

الإجابة

يمكن اختيار أصحاب أعلى راتب في كل قسم بسؤال معاكس: هل يوجد موظف في القسم نفسه راتبه أعلى من راتب الموظف الحالي؟ إذا كانت الإجابة لا، فإن الموظف الحالي من أصحاب أعلى راتب. يعبر NOT EXISTS عن هذه الفكرة مباشرة باستخدام استعلام مترابط.

للحفاظ على التعادلات، يجب استخدام مقارنة صارمة مثل >. الموظف الذي يساوي راتبه أعلى راتب لا يوجد من يتجاوزه، فيبقى في النتيجة مع زملائه المتعادلين. أما استخدام >= دون استبعاد الصف نفسه، فيجعل كل موظف يجد على الأقل نفسه ويؤدي إلى استبعاده.

مثال

WITH employees AS (
  SELECT 1 AS id, 10 AS department_id, 3000 AS salary
  UNION ALL SELECT 2, 10, 3000
  UNION ALL SELECT 3, 10, 1000
)
SELECT e.id FROM employees AS e
WHERE NOT EXISTS (
  SELECT 1 FROM employees AS e2
  WHERE e2.department_id = e.department_id
    AND e2.salary > e.salary
);

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

باختصار: انْفِ وجود راتب أعلى في القسم نفسه لتختار أصحاب الحد الأعلى وتحتفظ بجميع التعادلات.

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

اختبر فهمك

مع كون department_id وsalary غير قابلين لـNULL، أي شرط يحتفظ بجميع أصحاب أعلى راتب في كل قسم؟

SELECT e.id
FROM employees AS e
WHERE NOT EXISTS (
  SELECT 1 FROM employees AS e2
  WHERE e2.department_id = e.department_id
    AND /* ضع الشرط هنا */
);