لماذا لا يمكن استخدام اسم CTE في استعلام لاحق؟

متوسطقراءة دقيقةآخر تحديث 3 أكتوبر 2026

SQL قواعد البيانات

الإجابة

يرتبط اسم CTE بالتعليمة التي تحتوي على عبارة WITH الخاصة به. بمجرد انتهاء التعليمة، ينتهي نطاق الاسم. لذلك لا يمكن كتابة استعلام جديد بعد فاصلة منقوطة والاعتماد على أن النتيجة المسماة ما زالت متاحة كما لو كانت جدولًا محفوظًا.

هذا الفرق مهم لأن شكل الاستخدام داخل FROM يشبه قراءة الجدول. التشابه في الصياغة لا يعني التشابه في مدة البقاء. تستطيع الرجوع إلى CTE أكثر من مرة ضمن التعليمة نفسها، لكن استخدامها في تعليمة مستقلة يتطلب تعريفًا جديدًا أو اختيار وسيلة أخرى لحفظ النتيجة.

مثال

WITH chosen AS (
  SELECT 1 AS id
)
SELECT id FROM chosen;

WITH chosen AS (
  SELECT 1 AS id
)
SELECT COUNT(*) AS total FROM chosen;

يعيد المثال تعريف النتيجة في التعليمة الثانية عمدًا. ويمكن بدل التكرار إعادة تنظيم الحل في تعليمة واحدة إذا كانت حاجات القراءة تسمح بذلك. لا تتحول CTE إلى جدول دائم أو مؤقت بسبب استخدامها عدة مرات داخل تعليمة واحدة.

باختصار: ينتهي نطاق CTE بانتهاء تعليمتها، ويجب تعريفها مجددًا إذا احتاج إليها استعلام مستقل لاحق.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

لا يوجد جدول دائم أو مؤقت اسمه chosen. لماذا تفشل التعليمة الثانية في هذا الكود المقصود به إظهار خطأ؟

WITH chosen AS (
  SELECT 1 AS id
)
SELECT id FROM chosen;

SELECT COUNT(*) FROM chosen;