محتويات الدورة

قاعدة بيانات أوراكل / المتوسط: SQL التطبيقات والأدلة / الدرس 9

الاستعلامات الفرعية والتجزئة والمسارات الهرمية

ركّب مراحل استعلام مقروءة وتتبّع علاقات المستودعات دون خلط المسارات بالتجسيد.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • اختر الاستعلام المفرد واختبار الوجود والتجزئة وفق العدد المتوقع.
  • افهم START WITH وCONNECT BY ومعالجة الدورات.

للاستعلام الفرعي عقد لعدد الصفوف

يعيد الاستعلام المفرد عموداً من صف واحد على الأكثر. يصبح غياب الصف NULL ويسبب تعدد الصفوف خطأ. لذلك يناسب الحالات التي تضمن مفاتيحها أو تجميعها العدد المتوقع. لا تُخفِ علاقة ملتبسة بوضع MIN اعتباطي حول وصف إلا إذا كان اختيار الأصغر قاعدة العمل فعلاً. يسأل EXISTS عن وجود صف مؤهل فقط ولا يحتاج هذا الضمان. سمِّ العدد المتوقع لكل استعلام مضمّن في المراجعة، خصوصاً إذا كان المصدر الفريد سابقاً قد يكتسب مراجعات تاريخية.

تسمّي التجزئة خطوة التفكير

تعطي WITH اسماً لكتلة استعلام كي يفحص القارئ تفصيل مدخلاتها وعقد مخرجاتها. قد يدمج المحسّن الكتل المؤهلة أو يضمّنها أو يجسدها؛ النص لا يضمن إنشاء جدول وسيط أو حسابه مرة. استخدمها لفصل مجتمع الشحنات عن مجاميع العملاء والاختيار النهائي. ضع حدود الفترة في مرحلة المجتمع لاستخدام الصفوف نفسها في كل قياس. لا تفترض أنها حد أمني أو تمنع نقل جميع الشروط؛ تحتاج هذه المتطلبات آليات قاعدة مدعومة.

sql مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
WITH october_shipments AS (
 SELECT customer_id, charge FROM shipments
 WHERE booked_at >= DATE '2026-10-01' AND booked_at < DATE '2026-11-01'
), customer_totals AS (
 SELECT customer_id, SUM(charge) AS charge_total
 FROM october_shipments GROUP BY customer_id
)
SELECT customer_id, charge_total FROM customer_totals
WHERE charge_total >= 100
ORDER BY customer_id;

لكل مرحلة تفصيل واضح: الشحنة ثم العميل. تُعاد فقط العملاء ذوو إجمالي أكتوبر المؤهل.

صرّح بالجذر واتجاه الأب والابن

يمكن تخزين هرم المستودعات بـdepot_id وparent_id. يختار START WITH الجذور، ويعني CONNECT BY PRIOR depot_id = parent_id مطابقة معرّف الأب السابق مع مرجع الأب للابن الحالي. يعكس تغيير موضع PRIOR اتجاه التتبع. يعد LEVEL الجذر واحداً، ويعرض SYS_CONNECT_BY_PATH الطريق. قد تظهر العقدة القابلة للوصول عبر علاقات متعددة في مسارات متعددة؛ ليس التتبع تلقائياً جرد عقد مميزة. حدّد هل تعد النتيجة مستودعات أو روابط أو طرقاً كاملة قبل التجميع.

sql مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
WITH depots AS (
 SELECT 1 depot_id, CAST(NULL AS NUMBER) parent_id, 'Hub' label FROM dual UNION ALL
 SELECT 2, 1, 'East' FROM dual UNION ALL
 SELECT 3, 2, 'Gate' FROM dual
)
SELECT depot_id, LEVEL AS depth, SYS_CONNECT_BY_PATH(label, '/') AS route
FROM depots
START WITH parent_id IS NULL
CONNECT BY PRIOR depot_id = parent_id
ORDER SIBLINGS BY depot_id;
الناتج المتوقع
DEPOT_ID | DEPTH | ROUTE
1        | 1     | /Hub
2        | 2     | /Hub/East
3        | 3     | /Hub/East/Gate

تنتج السلسلة /Hub و/Hub/East و/Hub/East/Gate عند الأعماق 1 و2 و3.

السماح بالدورة لا يصلح الرسم

قد ينشئ رابط أب عرضي دورة وخطأ ORA-01436. يسمح NOCYCLE بإرجاع بيانات رغم الحلقة، ويكشف CONNECT_BY_ISCYCLE حالات الدورة المناسبة في هذا الوضع. إنه اختيار تشخيص أو تتبع محدود وليس إثباتاً لصحة الشجرة المخزنة. التقط الروابط المعيبة وأصلحها عبر مسار المجال. ضع حد عمق أو نطاق إذا سمح التطبيق برسوم اعتباطية وحدّد أثر تكرار العقد على المجاميع. لا تجمع رسوم الشحن مرة لكل مسار ممكن إلا إذا كانت المضاعفة مقصودة صراحة.

تصفية العقدة المعروضة لا تعني قطع ذريتها

تميّز المعالجة الهرمية اختيار الجذر وتتبّع العلاقة وتصفية WHERE اللاحقة. قد يحذف WHERE عقدة معروضة دون حذف ذريتها التي وصل إليها التتبع. إذا كان المطلوب منع المرور عبر مستودع محظور، ضع القيد في مرحلة المصدر أو التتبع المناسبة واختبر المسارات. يحفظ ORDER SIBLINGS BY ترتيب الأشقاء داخل الهرم، وقد يزيل ORDER BY العام العرض الهرمي. وتوفر التجزئة العودية نهجاً آخر موثقاً، لكن لا تنسخ صياغتها وقواعد الدورات من PostgreSQL دون مراجعة أوراكل.

الأخطاء الشائعة وإصلاحها

ORA-01427

لماذا يحدث؟
أعاد استعلام مفرد أكثر من صف.
كيف تصلحه؟
أصلح قيد المفتاح أو حوّل السؤال إلى مجموعة مقصودة.
كيف تتجنب تكراره؟
اضبط العدد المتوقع بقيود المصدر وبيانات تحتوي تكراراً.

ORA-01436

لماذا يحدث؟
تعود العلاقة الهرمية إلى سلف فتكوّن حلقة.
كيف تصلحه؟
حدّد الدورة واستخدم NOCYCLE بدلالات تشخيص صريحة فقط.
كيف تتجنب تكراره؟
تحقق من تغييرات الأب واختبر الدورات عند مراجعة الاستيراد.

تبقى الذرية بعد تصفية الأب

لماذا يحدث؟
اختلط شرط WHERE بعد التتبع بقطع الشجرة الفرعية.
كيف تصلحه؟
ضع قيد النطاق في المصدر أو مرحلة التتبع حسب المطلوب.
كيف تتجنب تكراره؟
اختبر عقدة وسطى محظورة لها ابن صالح.

اختبر فهمك

1. يُتوقع من البحث عن مستودع اسم واحد لكنه يملك نسختين تاريخيتين. هل يصلحه MIN(label) بصمت؟

اعرض الحل المشروح

لا؛ اختر المراجعة الصالحة بقواعد زمنية أو حالة صريحة ثم أثبت تفرّد البحث. يختار MIN ترتيباً معجمياً فقط وقد يخفي التباس النموذج. إذا كان التاريخ متعدد القيم مقصوداً فأعد مجموعة بدلاً من افتراض علاقة مفردة.

2. ما قيمة LEVEL للجذر، وأي ترتيب يحفظ بنية الأشقاء؟

اعرض الحل المشروح

للجذر LEVEL يساوي 1. يرتب ORDER SIBLINGS BY الأبناء تحت آبائهم مع حفظ البنية الهرمية. يخدم ORDER BY العام عرضاً مسطحاً مختلفاً. تحقق من المسارات على مثال متفرع صغير قبل إضافة المجاميع أو المسافات المرئية.

أهم ما تعلمته

  • تحتاج هيئة الاستعلام الفرعي ومسارات التتبع إلى تفكير صريح في العدد.
  • مرحلة الاستعلام المقروءة ليست تلقائياً حد تجسيد أو أمن.

المراجع الرسمية