CROSS JOIN والجداءات الديكارتية
عمليات الربط المتقاطع المتعمدة لإنشاء التركيبات، والعمليات العرضية التي تفجر عدد الصفوف
CROSS JOIN والجداءات الديكارتية درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
JOIN الذي يستخدمه المحاوِرون لإيقاعكم في الفخ
يقترن كل صف من الجدول الأيسر في CROSS JOIN بكل صف من الجدول الأيمن. ولا يوجد شرط ON. فإذا كان الجدول A يحتوي على 4 صفوف والجدول B على 3 صفوف، فستحتوي النتيجة على 4 x 3 = 12 صفًا.
يُسمى هذا حاصل الضرب الديكارتي. ويسأل المحاوِرون عنه لسببين: اختبار قدرتكم على توليد التركيبات عن قصد، ومعرفة ما إذا كنتم تكتشفون وجود cross join غير مقصود يؤدي إلى تضخم مجموعة النتائج.
صياغة CROSS JOIN الصريحة
الطريقة الحديثة والواضحة لكتابة حاصل الضرب الديكارتي هي استخدام الكلمة المفتاحية الصريحة CROSS JOIN. لاحظ عدم وجود عبارة ON، ما يوضح المقصود للمراجع بجلاء.
نقرن هنا كل مقاس بكل لون لإنشاء مصفوفة منتجات كاملة.
SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;صياغة الفاصلة القديمة
ستظل ترى حاصل الضرب الديكارتي مكتوبًا باستخدام فاصلة في عبارة FROM ومن دون شرط ربط. هذه هي صياغة ANSI القديمة.
ينتج ذلك النتيجة نفسها تمامًا التي ينتجها CROSS JOIN، لكنه أسلوب خطير: إذا كنت تقصد إضافة شرط ربط ونسيته، فستحصل بصمت على CROSS JOIN بدلًا من ظهور خطأ. فضّل استخدام CROSS JOIN الصريح.
-- Same result as CROSS JOIN, but easy to write by accident
SELECT s.size, c.color
FROM sizes s, colors c;مثال تطبيقي: إنشاء مخطط للمقاسات
لنفترض أن متجرًا يبيع القمصان بثلاثة مقاسات وأربعة ألوان، ويريد صفًا لكل تركيبة ممكنة، حتى التركيبات غير المتوفرة في المخزون بعد. ينشئ الربط التقاطعي جميع التركيبات الاثنتي عشرة في خطوة واحدة.
هذا هو الاستخدام المقصود الأكثر شيوعًا: إنشاء شبكة كاملة من الخيارات.
SELECT s.size, c.color, 0 AS stock_qty
FROM sizes s
CROSS JOIN colors c
ORDER BY s.size, c.color;إنشاء شبكة تقويم
من الاستخدامات الكلاسيكية الأخرى لـ CROSS JOIN في مقابلات العمل: إنشاء شبكة كثيفة بحيث تكون كل تركيبة موجودة حتى عند غياب بعض البيانات.
نُجري هنا CROSS JOIN بين كل متجر وكل تاريخ، بحيث يمنح LEFT JOIN لاحق مع بيانات المبيعات صفًا واحدًا لكل متجر في كل يوم، مع ملء الفجوات بأصفار. ويضمن الربط التقاطعي عدم تخطي أي مجموعة متجر-يوم.
SELECT st.store_id, d.day
FROM stores st
CROSS JOIN calendar d
WHERE d.day BETWEEN DATE '2024-01-01' AND DATE '2024-01-31';الانفجار الديكارتي غير المقصود
الخطر الذي يختبره القائمون على المقابلات: أن تربط جدولين ثم تنسى شرط الربط. بدلًا من ظهور خطأ، تعيد قاعدة البيانات بكل بساطة كل التركيبات الممكنة.
إذا كان جدول orders يحتوي على 100,000 صف وجدول customers على 50,000 صف، فسيحتوي الناتج على 5 مليارات صف. تتعطل الاستعلامات، وتنفد الذاكرة، وتبدو الأرقام أكبر بكثير من قيمها الحقيقية. ويُعد اكتشاف هذا النمط في مراجعة الشيفرة مؤشرًا قويًا على الفهم.
-- BUG: no join condition between the two tables
SELECT o.order_id, c.name
FROM orders o, customers c;
-- returns COUNT(orders) * COUNT(customers) rowsكيفية اكتشاف CROSS JOIN غير المقصود
الأعراض التي يريد منك القائمون على المقابلات ذكرها:
- يكون عدد الصفوف تقريبًا حاصل ضرب حجمي الجدولين، لا مجموعهما.
- تكون الدوال التجميعية مثل
SUMأكبر من قيمتها الحقيقية بمضاعف ثابت. - تُظهر خطة الاستعلام Nested Loop من دون مرشح ربط.
ويكون الحل في الغالب إضافة ON أو مساواة في WHERE مفقودة بين الجدولين.
CROSS JOIN مقابل INNER JOIN مع شرط ON صحيح دائمًا
يتطابق CROSS JOIN منطقيًا مع INNER JOIN ... ON 1=1. فكلاهما ينتج حاصل الضرب الديكارتي الكامل.
في الواقع، لا يتعدى الربط الداخلي كونه ربطًا تقاطعيًا يتبعه ترشيح وفق شرط ON. ويوضح هذا النموذج الذهني سبب تحوّل الربط الداخلي إلى ربط تقاطعي عند غياب الشرط.
-- These two queries return identical results
SELECT * FROM a CROSS JOIN b;
SELECT * FROM a INNER JOIN b ON 1 = 1;إجراء CROSS JOIN مع جدول أرقام
إليك حيلة قوية: أجرِ CROSS JOIN مع جدول صغير باسم numbers أو generate_series لمضاعفة الصفوف عمدًا. ويُستخدم ذلك لتوسيع صف واحد إلى عدة صفوف، مثل تحويل كمية إلى صفوف منفصلة لكل وحدة.
يُكرر هنا كل صف منتج qty مرة، وذلك بربطه بسلسلة والاحتفاظ بالأرقام التي لا تتجاوز الكمية.
SELECT p.product_id, n.n AS unit_number
FROM products p
CROSS JOIN generate_series(1, 100) AS n(n)
WHERE n.n <= p.qty;الأداء والممارسة الآمنة
بما أن الناتج ينمو بضرب أحجام المدخلات، فلا تُجرِ CROSS JOIN بين جدولين كبيرين أبدًا. احرص على أن يكون أحد الطرفين صغيرًا ومحدود الحجم على الأقل، مثل قائمة مقاسات أو تقويم صغير أو جدول أرقام.
في مقابلات العمل، اذكر ذلك صراحة: «لا تكون CROSS JOIN آمنة إلا عندما يكون أحد الطرفين صغيرًا ومحدود الحجم؛ وإلا يصبح الناتج غير قابل للإدارة.» توضح هذه الجملة حسن التقدير، لا مجرد معرفة الصياغة.
متى تستخدم CROSS JOIN
استخدم CROSS JOIN مقصودًا عندما تحتاج إلى كل التركيبات الممكنة بين مجموعتين:
- إنشاء مصفوفات الخيارات (المقاس × اللون).
- تكثيف السلاسل الزمنية (المتجر × اليوم) قبل استخدام LEFT JOIN.
- توسيع الصفوف باستخدام جدول أرقام.
إذا كنت لا تريد كل التركيبات الممكنة، فأنت على الأرجح تحتاج إلى ربط يتضمن شرط ON بدلًا من ذلك.
اختبار سريع
اختبر فهمك لحواصل الضرب الديكارتية.
خلاصة: CROSS JOIN
أهم النقاط:
- يقرن CROSS JOIN كل صف من الطرف الأيسر بكل صف من الطرف الأيمن؛ ويكون حجم الناتج حاصل ضرب حجمي المدخلين.
- تنتج صياغة الفاصلة من دون شرط حاصل الضرب الديكارتي نفسه، وغالبًا ما يحدث ذلك عن طريق الخطأ.
- استخدمه عمدًا لإنشاء شبكات التركيبات، وتكثيف السلاسل الزمنية، وتوسيع الصفوف عبر جدول أرقام.
- يتدهور الربط الداخلي بصمت إلى ربط تقاطعي عند غياب
ON، وهو خطأ الانفجار الذي يحب القائمون على المقابلات اختباره.
الأسئلة الشائعة
هل درس «CROSS JOIN والجداءات الديكارتية» مجاني؟
نعم — نص درس «CROSS JOIN والجداءات الديكارتية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «CROSS JOIN والجداءات الديكارتية»؟
عمليات الربط المتقاطع المتعمدة لإنشاء التركيبات، والعمليات العرضية التي تفجر عدد الصفوف تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟
لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «CROSS JOIN والجداءات الديكارتية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟
نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- CROSS JOIN والجداءات الديكارتية
- SELF JOIN للتسلسلات الهرمية
- مقارنة الصفوف داخل جدول واحد
- اختيار نوع الربط المناسب