0Pricing
Coding Interview Prep · درس

SELF JOIN للتسلسلات الهرمية

ربط جدول بنفسه لنمذجة علاقات الموظف والمدير والأصل والفرع

SELF JOIN للتسلسلات الهرمية درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

ما هو SELF JOIN فعليًا

الربط الذاتي هو ببساطة ربط يظهر فيه الجدول على طرفي العملية. لا توجد كلمة مفتاحية خاصة باسم SELF JOIN؛ بل تكتب INNER أو LEFT JOIN عاديًا، وتشير إلى الجدول نفسه مرتين.

الحيلة التي تجعل ذلك ممكنًا هي الأسماء المستعارة للجداول. امنح كل نسخة اسمًا مستعارًا مختلفًا حتى يتعامل المحرك معهما كجدولين مستقلين.

SELECT e.name, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

لماذا تكون الأسماء المستعارة إلزامية

من دون أسماء مستعارة مختلفة يصبح الاستعلام غامضًا: يظهر كل اسم عمود مرتين، ولا يستطيع المحرك معرفة النسخة التي تقصدها. ويحل تعيين اسم مستعار لكل نسخة هذه المشكلة.

اقرأ الربط هكذا: «اقرن كل صف لموظف بصف الموظف الذي يمثّل مديره.» الاسم المستعار e هو الموظف، وm هو المدير، وكلاهما مأخوذ من الجدول الفعلي نفسه.

-- e = the employee, m = that employee's manager
SELECT e.id, e.name, m.name AS reports_to
FROM employees AS e
JOIN employees AS m ON e.manager_id = m.id;

نموذج الموظف والمدير

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

يمثل جدول employees الذي يحتوي على manager_id يشير إلى employees.id مخططًا تنظيميًا كاملًا في جدول واحد. فكل مدير ليس إلا صفًا آخر لموظف.

-- One table holds the whole hierarchy
-- employees(id, name, manager_id)
-- manager_id -> employees.id

عرض الجميع مع مديريهم

السؤال الأكثر شيوعًا عن الربط الذاتي: اعرض كل موظف بجوار اسم مديره. اربط نسخة الموظفين بنسخة المديرين وفق e.manager_id = m.id.

يعيد ذلك صفًا واحدًا لكل موظف يوجد له مدير. لاحظ أن أعلى الهرم التنظيمي، أي المدير التنفيذي، لديه NULL في manager_id، ولذلك سيُستبعد باستخدام ربط داخلي.

SELECT e.name AS employee, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

استخدام LEFT JOIN للإبقاء على جذر الشجرة

لتضمين المدير التنفيذي، الذي تكون قيمة manager_id لديه هي NULL، بدّل إلى LEFT JOIN. يُحافَظ على جانب الموظفين، بينما تعود أعمدة المدير بقيمة NULL للصفوف التي لا أصل لها.

يستخدم القائمون على المقابلات هذا لاختبار تذكّرك أن الربط الذاتي الداخلي يُسقط العقد الجذرية. والحل هو نفسه في أي حالة ربط خارجي تتطلب «الإبقاء على الصفوف غير المتطابقة».

SELECT e.name AS employee,
       COALESCE(m.name, '(top level)') AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

عدّ المرؤوسين المباشرين لكل مدير

سؤال متابعة شائع: كم شخصًا يعمل مباشرة تحت إدارة كل مدير؟ أجرِ ربطًا ذاتيًا، ثم جمّع حسب المدير.

نربط الموظفين بالمديرين، ونجمع حسب هوية المدير، ثم نعدّ الموظفين. ويحصي ذلك المرؤوسين المباشرين فقط، لا الشجرة الفرعية بأكملها.

SELECT m.name AS manager, COUNT(*) AS direct_reports
FROM employees e
JOIN employees m ON e.manager_id = m.id
GROUP BY m.id, m.name
ORDER BY direct_reports DESC;

التعمق إلى مستويين

للحصول على الموظف ومديره ومدير مديره، اربط ثلاث نسخ من الجدول بالتتابع. ويمثل كل مستوى ربطًا ذاتيًا إضافيًا.

يصلح هذا لعمق ثابت ومعروف. أما إذا احتجت إلى عمق عشوائي، فلن يكفي الربط الذاتي؛ وهنا يكون المؤشر إلى استخدام CTE تكراري، وهو ما يتوقع القائمون على المقابلات أن تذكره.

SELECT e.name AS employee,
       m.name AS manager,
       g.name AS grand_manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
LEFT JOIN employees g ON m.manager_id = g.id;

الربط الذاتي مقابل CTE التكراري

التمييز الأساسي الذي يختبره القائمون على المقابلات:

  • يعالج الربط الذاتي عددًا ثابتًا من المستويات. فثلاث نسخ تعني ثلاثة مستويات لا أكثر.
  • يعالج CTE تكراري عمقًا غير محدود عبر إعادة ربط الجدول بنفسه حتى لا تظهر صفوف جديدة.

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

فئات الأصل والفرع

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

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

SELECT c.name AS category,
       p.name AS parent_category
FROM categories c
LEFT JOIN categories p ON c.parent_id = p.id;

الأخطاء الشائعة في الربط الذاتي

انتبه إلى ما يلي في مقابلات العمل:

  • نسيان الأسماء المستعارة، ما يؤدي إلى أخطاء الأعمدة الغامضة.
  • استخدام INNER JOIN وإسقاط الصفوف الجذرية بصمت، أي الصفوف ذات الأصل NULL.
  • الربط في الاتجاه الخطأ: e.id = m.manager_id بدلًا من e.manager_id = m.id.

اذكر دائمًا بصوت واضح أي اسم مستعار يمثل الفرع وأيهما يمثل الأصل قبل كتابة شرط ON.

متى تستخدم الربط الذاتي

استخدم الربط الذاتي كلما ربط جدول صفوفًا بـ صفوف أخرى في الجدول نفسه:

  • التدرجات الهرمية ذات مستوى التتبع الواحد الثابت، مثل الموظف والمدير.
  • إقران صفوف جدول واحد أو مقارنتها، وهو ما يتناوله الدرس التالي.

إذا كانت العلاقة تكرارية وغير محدودة، فاذكر أن CTE تكراري هو الأداة الأفضل. وهذه الدقة تميز المبتدئين عن ذوي الخبرة المتوسطة.

اختبار سريع

اختبر استيعابك للروابط الذاتية في التدرجات الهرمية.

خلاصة: SELF JOIN للتدرجات الهرمية

أهم النقاط:

  • الربط الذاتي هو ربط عادي يظهر فيه الجدول نفسه على الطرفين، مع تمييز النسختين باستخدام الأسماء المستعارة.
  • تمثل قائمة التجاور، أي المفتاح الأجنبي الذي يشير إلى نفسه مثل manager_id، شجرةً في جدول واحد.
  • استخدم INNER JOIN للأزواج المتطابقة، وLEFT JOIN للإبقاء على الصفوف الجذرية ذات الأصول NULL.
  • تعالج الروابط الذاتية عمقًا ثابتًا؛ أما التتبع غير المحدود فيحتاج إلى CTE تكراري.

الأسئلة الشائعة

هل درس «SELF JOIN للتسلسلات الهرمية» مجاني؟

نعم — نص درس «SELF JOIN للتسلسلات الهرمية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

ماذا ستتعلم في «SELF JOIN للتسلسلات الهرمية»؟

ربط جدول بنفسه لنمذجة علاقات الموظف والمدير والأصل والفرع تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟

لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «SELF JOIN للتسلسلات الهرمية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟

نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. CROSS JOIN والجداءات الديكارتية
  2. SELF JOIN للتسلسلات الهرمية
  3. مقارنة الصفوف داخل جدول واحد
  4. اختيار نوع الربط المناسب
← العودة إلى Coding Interview Prep