0Pricing
SQL Academy · درس

عمليات الربط الجانبي (LATERAL JOIN)

أشر إلى عنصر FROM السابق من داخل استعلام فرعي باستخدام LATERAL — وهو النظير في SQL لاستدعاء دالة لكل صف.

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

ما هي LATERAL؟

تتيح LATERAL لاستعلام فرعي في عبارة FROM الرجوع إلى أعمدة العناصر السابقة في قائمة FROM. ومن دون LATERAL، لا يمكن لعناصر FROM رؤية بعضها بعضاً.

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

تعني LATERAL: «لكل صف في الجانب الأيسر، قيّم هذا الاستعلام». وهي تشبه استعلاماً فرعياً مرتبطاً — لكنها توجد في عبارة FROM وتُرجع عدة صفوف وأعمدة.

أعلى 3 طلبات لكل مستخدم

الاستخدام الكلاسيكي لـ LATERAL:

SELECT u.id, u.email, o.id AS order_id, o.total
FROM users u
JOIN LATERAL (
  SELECT id, total FROM orders
  WHERE user_id = u.id
  ORDER BY total DESC
  LIMIT 3
) AS o ON true;

لماذا لا نستخدم استعلاماً فرعياً في SELECT؟

يُرجع الاستعلام الفرعي القياسي في SELECT قيمة واحدة. أما LATERAL فتُرجع عدة صفوف وعدة أعمدة لكل صف خارجي.

LATERAL مع الدوال

تتصرف الدوال التي تُرجع مجموعات كما لو كانت LATERAL افتراضياً:

SELECT t.id, unnest_tag
FROM posts t
CROSS JOIN LATERAL unnest(t.tags) AS unnest_tag;

-- Equivalent (set-returning functions are implicit LATERAL):
SELECT t.id, unnest_tag
FROM posts t, unnest(t.tags) AS unnest_tag;

LATERAL مقابل دوال النوافذ

بالنسبة إلى «أعلى N لكل مجموعة»، يمكن استخدام كل من LATERAL وROW_NUMBER. وغالباً ما تكون ROW_NUMBER أكثر كفاءة لأنها تمر على الجدول مرة واحدة، بينما تعيد LATERAL الاستعلام لكل صف خارجي.

-- ROW_NUMBER alternative:
WITH ranked AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY total DESC) AS rn
  FROM orders
)
SELECT u.email, r.id, r.total
FROM users u
JOIN ranked r ON r.user_id = u.id
WHERE r.rn <= 3;

LATERAL مع دوال التجميع

قيم محسوبة مسبقاً لكل صف:

SELECT u.email, stats.last_order_at, stats.total_orders
FROM users u
LEFT JOIN LATERAL (
  SELECT MAX(created_at) AS last_order_at,
         COUNT(*)        AS total_orders
  FROM orders WHERE user_id = u.id
) AS stats ON true;

ON true

تتطلب LATERAL عبارة ON عند استخدام JOIN — لكن شرط الوصلة موجود داخل الاستعلام الفرعي، ولذلك تكون عبارة ON الخارجية هي true.

CROSS JOIN LATERAL مقابل LEFT JOIN LATERAL

  • CROSS JOIN LATERAL — يُحذف الصف الخارجي إذا لم يُرجع الاستعلام الداخلي أي صفوف
  • LEFT JOIN LATERAL ... ON true — يُحتفظ بالصف الخارجي مع أعمدة NULL

LATERAL لاستعلامات المسافة

أقرب متجر لكل مستخدم:

SELECT u.id, s.name, s.distance
FROM users u
CROSS JOIN LATERAL (
  SELECT name, location <-> u.location AS distance
  FROM stores
  ORDER BY location <-> u.location
  LIMIT 1
) AS s;

‏LATERAL معيار في SQL

أُدرجت في معيار SQL:1999. تطبقها PostgreSQL باستخدام LATERAL، بينما يستخدم SQL Server CROSS APPLY / OUTER APPLY.

الأداء

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

خلاصة

LATERAL = «استعلام فرعي في FROM يرى الصف الخارجي».

  • أعلى N لكل مجموعة
  • حساب مسبق للقيم لكل صف
  • دوال تُرجع مجموعات
  • استخدمها مع LEFT JOIN ... ON true للوصلات الخارجية

تحقق سريع

ما الذي تتيحه LATERAL ولا يتيحه استعلام فرعي عادي في FROM؟

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

هل درس «عمليات الربط الجانبي (LATERAL JOIN)» مجاني؟

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

ماذا ستتعلم في «عمليات الربط الجانبي (LATERAL JOIN)»؟

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

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

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

كم من الوقت يستغرق درس «عمليات الربط الجانبي (LATERAL JOIN)»؟

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

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

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

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

  1. عمليات Cross Join والمنتجات الديكارتية
  2. عمليات الربط الجانبي (LATERAL JOIN)
  3. الربط المضاد والربط شبه الكامل (NOT EXISTS)
  4. ضبط أداء الربط بين جداول متعددة
← العودة إلى SQL Academy