0Pricing
SQL Interview Prep · درس

التنقل في المخطط التنظيمي

تتبّع التسلسل الهرمي للموظفين والمديرين إلى أي عمق

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

سؤال المخطط التنظيمي

"لديك جدول employees يحتوي على id وname وmanager_id؛ اعرض كل من يقع تحت مدير معيّن، مهما كان العمق." هذا أحد أكثر أسئلة المقابلات شيوعًا حول CTE التكرارية.

الجدول ذاتي المرجع: إذ يشير manager_id إلى id في صف آخر. في هذا الدرس ستجتازه في الاتجاهين: إلى الأسفل (المرؤوسون) وإلى الأعلى (سلسلة القيادة).

الجدول النموذجي

تخيّل هذه البيانات. الرئيس التنفيذي لديه مدير بقيمة NULL. أما الجميع الآخرون فيرفعون تقاريرهم إلى المستوى الأعلى في السلسلة.

  • 1 Ada (المدير NULL)
  • 2 Ben (المدير 1)
  • 3 Cleo (المدير 1)
  • 4 Dan (المدير 2)
  • 5 Eve (المدير 4)

إذًا يكون العمق: Ada → Ben → Dan → Eve. تذكّر ذلك أثناء اجتيازنا للهيكل.

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    manager_id INT REFERENCES employees(id)
);

الاجتياز إلى الأسفل انطلاقًا من مدير

لعرض جميع المرؤوسين تحت مدير تختاره، يحدد جزء البداية ذلك المدير (أو مرؤوسيه المباشرين)، ثم يتتبع العضو التكراري manager_id إلى الأسفل.

نبدأ هنا من Ben (المعرّف 2) ونجمع كل من يقع تحته.

WITH RECURSIVE subtree AS (
    SELECT id, name, manager_id, 1 AS depth
    FROM employees WHERE id = 2
    UNION ALL
    SELECT e.id, e.name, e.manager_id, s.depth + 1
    FROM employees e
    JOIN subtree s ON e.manager_id = s.id
)
SELECT name, depth FROM subtree ORDER BY depth;

قراءة النتائج

يعيد الاستعلام أعلاه Ben عند العمق 1، وDan عند العمق 2، وEve عند العمق 3. هيّأ جزء البداية Ben؛ فعثر التكرار الأول على Dan (الذي مديره هو Ben)، وعثر التكرار الثاني على Eve (التي مديرها هي Dan)، ولم يعثر التكرار الثالث على أحد، فتوقف التكرار.

إذا سأل المُحاوِر "كم مستوى يفصل Eve عن Ben إلى الأسفل؟"، فسيجيب عمود depth مباشرةً: 3 ناقص 1 يساوي مستويين.

الاجتياز إلى الأعلى حتى الرئيس التنفيذي

السؤال العكسي شائع بالقدر نفسه: "اعرض سلسلة القيادة الكاملة لـ Eve وصولًا إلى الرئيس التنفيذي." اعكس اتجاه الربط — فالعضو التكراري يتتبع الآن manager_id للصف الحالي صعودًا إلى الأصل.

WITH RECURSIVE chain AS (
    SELECT id, name, manager_id, 1 AS lvl
    FROM employees WHERE id = 5
    UNION ALL
    SELECT e.id, e.name, e.manager_id, c.lvl + 1
    FROM employees e
    JOIN chain c ON e.id = c.manager_id
)
SELECT name, lvl FROM chain ORDER BY lvl;

إلى الأسفل أم إلى الأعلى: ينعكس الربط

الاختلاف البنيوي الوحيد بين الاجتياز إلى الأسفل والاجتياز إلى الأعلى هو شرط الربط:

  • إلى الأسفل (العثور على المرؤوسين): e.manager_id = cte.id — طابِق الموظفين الذين يكون مديرهم صفًا موجودًا لدينا بالفعل.
  • إلى الأعلى (العثور على المديرين): e.id = cte.manager_id — طابِق الموظف الذي يساوي معرّفه مدير الصف الحالي لدينا.

القدرة على شرح هذا الانعكاس بوضوح تترك انطباعًا جيدًا لدى المُحاوِرين.

بناء شجرة متداخلة

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

WITH RECURSIVE org AS (
    SELECT id, name, 1 AS depth
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, o.depth + 1
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT REPEAT('  ', depth - 1) || name AS tree
FROM org
ORDER BY depth;

تجميع المسار

لعرض المسار الكامل من الرئيس التنفيذي إلى كل شخص، احتفظ بسلسلة path. هذه هي التقنية نفسها من الدرس السابق، مطبقةً على المخطط التنظيمي.

WITH RECURSIVE org AS (
    SELECT id, name, CAST(name AS VARCHAR(500)) AS path
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, o.path || ' / ' || e.name
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT name, path FROM org ORDER BY path;

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

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

نحسب هنا جميع المرؤوسين غير المباشرين تحت Ada (الرئيس التنفيذي) باجتياز الشجرة كاملةً وعدّ الصفوف الواقعة تحت الجذر.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id, 0 AS depth
    FROM employees WHERE id = 1
    UNION ALL
    SELECT e.id, e.name, e.manager_id, o.depth + 1
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT COUNT(*) - 1 AS total_reports FROM org;

الأخطاء الشائعة

انتبه إلى هذه الحالات التي يضعها المُحاوِرون كفخاخ:

  • اتجاه الربط الخاطئ — يؤدي استخدام e.manager_id = cte.id عندما تقصد الصعود إلى إعادة المجموعة الخاطئة.
  • نسيان عامل تصفية جزء البداية — إذا حذفت WHERE id = X فستهيّئ كل صف، وتعيد الغابة بأكملها.
  • خطأ بمقدار واحد في العمق — قرر ما إذا كانت قيمة البداية هي العمق 0 أم 1، والتزم بذلك باستمرار.

لماذا لا نستخدم الربط الذاتي فحسب؟

يمكن للربط الذاتي جلب عدد ثابت من المستويات: ربط واحد للمرؤوسين المباشرين، وربطان لمرؤوسيهم، وهكذا. لكن يجب أن تعرف العمق مسبقًا وأن تكتب ربطًا لكل مستوى.

تتعامل CTE التكرارية مع عمق اعتباطي غير معروف في استعلام واحد. عندما يقول المُحاوِر إن "التسلسل الهرمي قد يتكون من أي عدد من المستويات"، فهذا يستبعد عمليات الربط الذاتي العادية ويشير إلى التكرار.

تحقق سريع

تأكد من قدرتك على عكس اتجاه الاجتياز.

الخلاصة

اجتياز المخطط التنظيمي هو الهيكل العودي المطبَّق على جدول يُشير إلى نفسه:

  • إلى الأسفل: ابدأ بمدير، ثم نفّذ الربط باستخدام e.manager_id = cte.id.
  • إلى الأعلى: ابدأ بموظف، ثم نفّذ الربط باستخدام e.id = cte.manager_id.
  • احتفظ بـ depth للمسافة البادئة وبـ path للسلسلة الكاملة.
  • تتعامل العودية مع أي عمق غير معروف، وهو ما لا يستطيع الربط الذاتي فعله.

التالي: استخدام العودية لإنشاء سلاسل من الأرقام والتواريخ.

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

هل درس «التنقل في المخطط التنظيمي» مجاني؟

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

ماذا ستتعلم في «التنقل في المخطط التنظيمي»؟

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

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

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

كم من الوقت يستغرق درس «التنقل في المخطط التنظيمي»؟

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

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

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

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

  1. الأعضاء الأساسيون والتكراريون
  2. التنقل في المخطط التنظيمي
  3. إنشاء سلاسل الأرقام والتواريخ
  4. تجنب التكرار اللانهائي
← العودة إلى SQL Interview Prep