التعبيرات الجدولية الشائعة
تمثل التعبيرات الجدولية الشائعة استعلامات فرعية مُسمّاة. ويمكن الإشارة إليها بالاسم في أي موضع داخل استعلامSELECT يُسمح فيه باستخدام تعبير جدولي.
كما يمكن الإشارة إلى الاستعلامات الفرعية المُسمّاة بالاسم ضمن نطاق الاستعلام الحالي أو ضمن نطاقات الاستعلامات الفرعية التابعة.
يُستبدل كل مرجع إلى تعبير جدولي شائع في استعلامات SELECT دائمًا بالاستعلام الفرعي الوارد في تعريفه إذا لم يكن CTE معرّفًا صراحةً على أنه materialized (راجع التعبيرات الجدولية الشائعة المُجسَّدة).
ويُمنَع التكرار العودي بإخفاء CTE الحالي من عملية حلّ المعرّفات.
يرجى ملاحظة أن CTEs لا تضمن النتائج نفسها في جميع المواضع التي يُشار إليها فيها، لأن الاستعلام يُعاد تنفيذه عند كل استخدام.
الصيغة
مثال
فيما يلي مثال على حالة يُعاد فيها تنفيذ استعلام فرعي:1000000
لكن بما أننا نشير إلى cte_numbers مرتين، تُولَّد أرقام عشوائية في كل مرة، ولذلك نرى نتائج عشوائية مختلفة مثل 280501, 392454, 261636, 196227 وهكذا…
التعبيرات الجدولية الشائعة المُجسَّدة
بشكل افتراضي، يضمّن ClickHouse الاستعلام الفرعي الخاص بـ CTE في كل موضع يُشار إليه فيه، ويعيد تنفيذه في كل مرة. تؤدي إضافة الكلمة المفتاحيةMATERIALIZED إلى توجيه ClickHouse لتنفيذ الاستعلام الفرعي لـ CTE مرة واحدة فقط، وتخزين النتائج في جدول مؤقت، ثم خدمة جميع المراجع من ذلك الجدول.
ويكون هذا مفيدًا بشكل خاص عندما يُشار إلى CTE نفسه عدة مرات داخل الاستعلام (على سبيل المثال، في عمليات ربط ذاتي أو في عدة استعلامات فرعية IN)، لأن العملية الحسابية الأساسية لا تحدث إلا مرة واحدة.
تُعد Materialized CTEs ميزة تجريبية.
ويتطلب استخدامها تفعيل الإعداد
enable_materialized_cte.
وإذا كان الإعداد معطّلًا، يتم تجاهل الكلمة المفتاحية MATERIALIZED: حيث يُضمَّن CTE في كل موضع إشارة إليه كأي CTE عادي، ويُسجَّل تحذير في السجل.الصيغة
متى تستخدم
تكون Materialized CTEs أكثر فائدة في الحالات التالية:- عند الإشارة إلى CTE نفسه أكثر من مرة ضمن استعلام.
فبدون
MATERIALIZED، تُعيد كل إشارة تنفيذ الاستعلام الفرعي بشكل مستقل. - عندما يحتوي CTE على دوال غير حتمية مثل
generateRandom. يضمن materializing أن ترى جميع الإشارات البيانات نفسها. - عندما يتضمن CTE حسابات مكلفة (مثل عمليات aggregation وJOIN وعمليات المسح الكبيرة) ولا ينبغي تكرارها.
أمثلة
المثال 1: ربط ذاتي على CTE مُجسَّدة من دونMATERIALIZED، سينفّذ كل جانب من جانبي الربط الاستعلام الفرعي بشكل مستقل.
مع MATERIALIZED، لا يُمسَح الجدول إلا مرة واحدة، ويقرأ جانبا الربط من الجدول المؤقت نفسه.
CTEs) مع generateRandom نتائج مختلفة في كل موضع تتم فيه الإشارة إليها.
يضمن تجسيد الـ CTE الاتساق:
1000000.
مثال 3: ربط تعابير CTE المجسّدة
يمكن لتعابير CTE المجسّدة أن تُشير إلى تعابير CTE مجسّدة أخرى.
يحلّ ClickHouse التبعيات ويُجسّدها بالترتيب الصحيح:
القيود
- يتطلب إعدادًا تجريبيًا: يجب تمكين الإعداد
enable_materialized_cte. وإذا كان معطّلًا، فسيتم تجاهل الكلمة المفتاحيةMATERIALIZED: إذ تُضمَّن عبارة CTE في كل إشارة إليها كعبارة CTE عادية، ويُسجَّل تحذير. - غير مدعوم مع
RECURSIVE: لا يُسمح بالجمع بين الكلمتين المفتاحيتينMATERIALIZEDوRECURSIVE، وينتج عن ذلك استثناءUNSUPPORTED_METHOD. - عبارات CTE المرتبطة غير مسموح بها: لا يمكن لتعبير الجدول الشائع المُجَّسد أن تُشير إلى أعمدة من نطاقات الاستعلام الخارجية.
التعبيرات القياسية الشائعة
يتيح لك ClickHouse تعريف أسماء مستعارة لأي تعبيرات قياسية في عبارةWITH.
ويمكن الرجوع إلى التعبيرات القياسية الشائعة في أي موضع ضمن الاستعلام.
إذا كان التعبير القياسي الشائع يشير إلى شيء غير قيمة حرفية ثابتة، فقد يؤدي ذلك إلى وجود متغيرات حرة.
يحلّ ClickHouse أي معرّف ضمن أقرب نطاق ممكن، ما يعني أن المتغيرات الحرة قد تشير إلى كيانات غير متوقعة في حال تعارض الأسماء، أو قد تؤدي إلى استعلام فرعي مترابط.
يوصى بتعريف CSE على شكل دالة لامبدا مع ربط جميع المعرّفات المستخدمة، لتحقيق سلوك أكثر قابلية للتنبؤ عند حلّ معرّفات التعبير.
الصيغة
أمثلة
مثال 1: استخدام تعبير ثابت كـ”متغير”extension مقيّدًا داخل متن دالة لامبدا gen_name.
مع أن extension مُعرَّف على أنه '.txt' كتعبير قياسي شائع ضمن نطاق تعريف generated_names واستخدامه، فإنه يُفسَّر على أنه عمود في الجدول extension_list، لأنه متاح في الاستعلام الفرعي generated_names.
الاستعلامات التكرارية
يسمح المُعدِّل الاختياريRECURSIVE لاستعلام WITH بالإشارة إلى ناتجه الخاص. مثال:
مثال: جمع الأعداد الصحيحة من 1 إلى 100
تعتمد تعبيرات CTE التكرارية على محلل الاستعلام الذي طُرح في الإصدار
24.3، وهو الإعداد الافتراضي منذ ذلك الإصدار وإلزامي منذ 26.9. في الإصدارات الأقدم التي لا يزال فيها المحلل معطّلًا على المثيل أو الدور أو ملف التعريف، يؤدي CTE تكراري إلى ظهور الاستثناء (UNKNOWN_TABLE) أو (UNSUPPORTED_METHOD)؛ فعِّل إعداد enable_analyzer هناك أو قم بالترقية.WITH التكراري دائمًا على النحو التالي: عبارة غير تكرارية، ثم UNION ALL، ثم عبارة تكرارية، ولا يجوز إلا للعبارة التكرارية أن تتضمن مرجعًا إلى مخرجات الاستعلام نفسه. ويُنفَّذ استعلام CTE التكراري كما يلي:
- قيِّم العبارة غير التكرارية. وضع نتيجة استعلام العبارة غير التكرارية في جدول عمل مؤقت.
- ما دام جدول العمل غير فارغ، كرِّر الخطوات التالية:
- قيِّم العبارة التكرارية، مع استبدال المرجع الذاتي التكراري بالمحتويات الحالية لجدول العمل. وضع نتيجة استعلام العبارة التكرارية في جدول وسيط مؤقت.
- استبدل محتويات جدول العمل بمحتويات الجدول الوسيط، ثم أفرغ الجدول الوسيط.
ترتيب البحث
لإنشاء ترتيب العمق أولًا، نحسب لكل صف في النتيجة مصفوفةً من الصفوف التي سبق أن زرناها: مثال: اجتياز الشجرة بترتيب العمق أولًااكتشاف الحلقات
لننشئ أولًا جدول graph:Maximum recursive CTE evaluation depth:
استعلامات لا نهائية
يمكن أيضًا استخدام استعلامات CTE التكرارية اللانهائية إذا استُخدمLIMIT في الاستعلام الخارجي:
مثال: استعلام CTE تكراري لا نهائي
الفاصلة الختامية
يُسمح بوضع فاصلة بعد آخر عنصر في عبارةWITH: