ARRAY JOIN.
تأتي هذه التسمية من أنه يمكن النظر إليها على أنها تنفيذ JOIN مع مصفوفة أو بنية بيانات متداخلة. والغرض منها مشابه للدالة arrayJoin، لكن وظيفة العبارة أوسع.
صيغ مصادر الجداول
FROM unnest(...) وCROSS JOIN UNNEST(...) وLATERAL unnest(...) المستخدمة في PostgreSQL غير مدعومة. استخدم ARRAY JOIN بدلًا من ذلك. الاسم unnest (منذ الإصدار 26.5) هو اسم بديل لاستدعاء الدالة arrayJoin (SELECT unnest(arr))، وليس دالة جدول. أما JOIN LATERAL <subquery> مع استعلام فرعي مترابط فهو مدعوم بشكل منفصل كميزة تجريبية، راجع JOIN.ARRAY JOIN مبيّنة أدناه:
ARRAY JOIN- في الحالة الأساسية، لا تُضمَّن المصفوفات الفارغة في نتيجةJOIN.LEFT ARRAY JOIN- تحتوي نتيجةJOINعلى صفوف تتضمن مصفوفات فارغة. وتُضبط قيمة المصفوفة الفارغة على القيمة الافتراضية لنوع عنصر المصفوفة (وتكون عادةً 0 أو سلسلة فارغة أو NULL).
أمثلة أساسية على ARRAY JOIN
ARRAY JOIN و LEFT ARRAY JOIN
تُظهر الأمثلة أدناه كيفية استخدام عبارتيARRAY JOIN و LEFT ARRAY JOIN. لنُنشئ جدولًا يحتوي على عمود من النوع Array، ثم نُدرج فيه قيمًا:
ARRAY JOIN:
LEFT ARRAY JOIN:
ARRAY JOIN ودالة arrayEnumerate
تُستخدم هذه الدالة عادةً معARRAY JOIN. وتتيح عدّ شيءٍ ما مرةً واحدة فقط لكل مصفوفة بعد تطبيق ARRAY JOIN. مثال:
ARRAY JOIN)، ويمثّل Hits عدد مشاهدات الصفحات (السلاسل قبل ARRAY JOIN). وفي هذه الحالة تحديدًا، يمكنك الحصول على النتيجة نفسها بطريقة أبسط:
ARRAY JOIN وarrayEnumerateUniq
تفيد هذه الدالة عند استخدامARRAY JOIN وتجميع عناصر المصفوفة.
في هذا المثال، يُحتسب لكل معرّف هدف عدد التحويلات (إذ إن كل عنصر في بنية البيانات المتداخلة Goals هو هدف تم بلوغه، وهو ما نشير إليه على أنه تحويل) وعدد الجلسات. ومن دون ARRAY JOIN، كنا سنحسب عدد الجلسات على أنه sum(Sign). ولكن في هذه الحالة تحديدًا، تضاعفت الصفوف بسبب البنية المتداخلة Goals، لذلك، لكي نحصي كل جلسة مرة واحدة بعد ذلك، نطبّق شرطًا على قيمة الدالة arrayEnumerateUniq(Goals.ID).
استخدام الأسماء المستعارة
يمكن تحديد اسم مستعار لمصفوفة ضمن عبارةARRAY JOIN. في هذه الحالة، يمكن الوصول إلى أحد عناصر المصفوفة عبر هذا الاسم المستعار، بينما يُشار إلى المصفوفة نفسها باسمها الأصلي. مثال:
ARRAY JOIN على مصفوفة خارجية. على سبيل المثال:
ARRAY JOIN. في هذه الحالة، يُنفَّذ JOIN عليها جميعًا في الوقت نفسه (الجمع المباشر، وليس الضرب الديكارتي). لاحظ أن جميع المصفوفات يجب أن تكون بالحجم نفسه افتراضيًا. مثال:
SETTINGS enable_unaligned_array_join = 1. مثال:
ARRAY JOIN مع بنية بيانات متداخلة
يعملARRAY JOIN أيضًا مع بنية بيانات متداخلة:
ARRAY JOIN، يكون المعنى مماثلًا لاستخدام ARRAY JOIN مع جميع عناصر المصفوفة التي تتألف منها. ترد الأمثلة أدناه:
JOIN أو المصفوفة الأصلية. مثال:
تفاصيل التنفيذ
يُحسَّن ترتيب تنفيذ الاستعلام عند تنفيذARRAY JOIN. وعلى الرغم من أنه يجب دائمًا تحديد ARRAY JOIN قبل عبارة WHERE/PREWHERE في الاستعلام، فمن الناحية التقنية يمكن تنفيذهما بأي ترتيب، ما لم تُستخدَم نتيجة ARRAY JOIN في التصفية. ويتحكم مُحسِّن الاستعلامات في ترتيب التنفيذ.
عدم التوافق مع التقييم المختصر للدوال
يُعد التقييم المختصر للدوال ميزة تُحسّن تنفيذ التعبيرات المعقدة في دوال محددة مثلif وmultiIf وand وor. وهي تمنع حدوث استثناءات محتملة، مثل القسمة على صفر، أثناء تنفيذ هذه الدوال.
يُنفَّذ arrayJoin دائمًا، ولا يدعم التقييم المختصر للدوال. ويعود ذلك إلى أنه دالة فريدة تُعالَج بشكل منفصل عن جميع الدوال الأخرى أثناء تحليل الاستعلام وتنفيذه، وتتطلب منطقًا إضافيًا لا يعمل مع التقييم المختصر للدوال. والسبب هو أن عدد الصفوف في النتيجة يعتمد على ناتج arrayJoin، كما أن تنفيذ arrayJoin بصورة كسولة معقد للغاية ومكلف.