مرکزی مواد پر جائیں
ماڈیول 7 · سبق 1 از 4کورس میں 25/57~12 min
ماڈیول اسباق (1/4)

CTE: WITH کے ساتھ ملٹی سٹیپ سوالات

حقیقی سوالات میں اضافہ ہوتا ہے: تین JOINs, a GROUP BY, a subquery, ایک اور ذیلی سوال… اور وہ پڑھے نہیں جا سکتے۔ CTEs ("کامن ٹیبل اظہارات"، WITH شق) آپ کو ایک نام دینے دیتا ہے انٹرمیڈیٹ مرحلہ اور اسے اس طرح استعمال کریں جیسے یہ مرکزی سوال میں ایک میز ہو۔

بنیادی نحو

SQL
WITH nome_cte AS (
  SELECT …    -- query interna
)
SELECT …      -- query principale, usa nome_cte come fosse una tabella
FROM   nome_cte;

ایک CTE درست ہے صرف اس سوال کے لیے جو اس کی پیروی کرتا ہے: یہ زندہ نہیں رہتا پھانسی

مثال

3 گاہکوں کو تلاش کریں جنہوں نے سب سے زیادہ خرچ کیا ہے (ڈیلیور شدہ آرڈرز سے زیادہ):

SQL
WITH total_spent AS (
  SELECT o.customer_id,
         SUM(oi.quantity * oi.unit_price) AS total
  FROM   orders      o
  JOIN   order_items oi ON oi.order_id = o.id
  WHERE  o.status = 'delivered'
  GROUP BY o.customer_id
)
SELECT c.email,
       s.total
FROM   total_spent s
JOIN   customers c ON c.id = s.customer_id
ORDER BY s.total DESC
LIMIT  3;

انگریزی میں پڑھیں: "پہلے فی صارف خرچ کا حساب لگائیں؛ پھر اس کے ساتھ شامل ہوں۔ گاہک اور سب سے اوپر 3" کو لے لو۔ CTE کے بغیر آپ کو ایک ان لائن کی ضرورت ہوگی۔ FROM میں ذیلی استفسار (قانونی، لیکن زیادہ شور)۔

جھرن میں ایک سے زیادہ CTEs

آپ متعدد CTEs کو کوما سے الگ کر سکتے ہیں، اور ہر ایک حوالہ دے سکتا ہے۔ پچھلے والوں کو:

SQL
WITH total_spent AS (
  SELECT customer_id, SUM(quantity * unit_price) AS total
  FROM   order_items oi
  JOIN   orders      o ON oi.order_id = o.id
  WHERE  o.status = 'delivered'
  GROUP BY customer_id
),
average AS (
  SELECT AVG(total) AS total_average
  FROM   total_spent
)
SELECT c.email, s.total
FROM   total_spent s
JOIN   customers c ON c.id = s.customer_id
CROSS JOIN average
WHERE  s.total > average.total_average
ORDER BY s.total DESC;

CROSS JOIN average کیونکہ average میں ہمیشہ ایک قطار ہوتی ہے: کارٹیشین پروڈکٹ صرف نتیجہ کی ہر قطار میں total_average جوڑتا ہے۔

CTE بمقابلہ ذیلی سوال: کب استعمال کرنا ہے۔

CTEs چمکتے ہیں جب:

  • ایک ہی ذیلی استفسار بنیادی استفسار میں دو یا زیادہ بار استعمال ہوتا ہے۔
  • آپ سٹرکچر کو نامزد مراحل میں واضح کرنا چاہتے ہیں (خود دستاویزی)؛
  • وہ بار بار آنے والے CTEs (WITH RECURSIVE، اس ماڈیول میں اگلا سبق)۔

ایک ان لائن ذیلی استفسار صرف ایک بار استعمال ہونے والے قدم کے لیے زیادہ جامع ہے۔

اسے آزمائیں

ورزش#sql.m7.l1.e1
کوششیں: 0لوڈ ہو رہا ہے…

'total_spent' نامی CTE استعمال کریں جو کہ ڈیلیور کردہ آرڈرز پر ہر گاہک کے کل خرچ (SUM(مقدار * یونٹ_قیمت)) کا حساب کرتا ہے۔ پھر مرکزی سوال میں سب سے اوپر 3 خرچ کرنے والوں کے لیے ای میل اور کل دکھائیں۔ نزولی کل ترتیب دیں، حد 3 تک۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

CTE رقم کی مقدار * یونٹ_قیمت کے اندر۔ اہم سوال میں id پر صارفین کو جوائن کریں۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش کا جائزہ لیں۔

ورزش#sql.m7.l1.e2
کوششیں: 0لوڈ ہو رہا ہے…

پچھلی مشق جیسا ہی 'total_spent' CTE۔ مرکزی استفسار میں ان صارفین کے لیے ای میل اور کل دکھائیں جن کا خرچ اوسط خرچ سے زیادہ ہے (کم از کم ایک ڈیلیور آرڈر والے تمام صارفین میں)۔ کل نزولی ترتیب سے ترتیب دیں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

کہاں میں اسکیلر ذیلی استفسار: کل_خرچ سے اوسط (کل) منتخب کریں۔

3 کوششوں کے بعد حل دستیاب ہے۔