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