ماڈیول اسباق (1/3)
CTEs کا تعارف (WITH)
CTEs کا تعارف (WITH)
جلد یا بدیر یہ سب کے ساتھ ہوتا ہے: آپ کو ایک جمع کے نتیجے کی بنیاد پر ڈیٹا کو فلٹر کرنے کی ضرورت ہے، پھر وہ فلٹر لیں اور اسے کسی اور مجموعی استفسار کے ساتھ جوائن کریں۔ آپ ایک SELECT کے اندر ایک SELECT لکھنا شروع کرتے ہیں، جو بدلے میں ایک اور SELECT کے FROM میں ختم ہوتا ہے۔
نتیجہ؟ Spaghetti SQL، ایک ایسا سوال جو کسی بھی انسان کے لیے ناقابل پڑھ ہے۔
CTEs (کامن ٹیبل ایکسپریشنز) آپ کو اس گڑبڑ کو ختم کرنے دیتے ہیں۔ آپ انہیں WITH کلیدی لفظ کے ساتھ فعال کرتے ہیں، جو آپ کو عارضی طور پر نامزد کردہ سوالات کی وضاحت کرنے اور پھر حتمی استفسار میں "ورچوئل ٹیبلز" کے بطور دوبارہ استعمال کرنے کی اجازت دیتا ہے۔
بنیادی نحو
WITH premium_customers AS (
SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(total_amount) > 1000
)
SELECT customers.first_name, premium_customers.total_spent
FROM customers
JOIN premium_customers ON customers.id = premium_customers.customer_id;جیسا کہ آپ دیکھ سکتے ہیں، نیچے کا بنیادی سوال premium_customers سے پڑھتا ہے گویا یہ ایک حقیقی میز ہے! اور یہ نیسٹڈ سبکوریز کے ساتھ میگا اندرونی شمولیت سے کہیں زیادہ پڑھنے کے قابل ہے۔
ہم بہت مہنگی مصنوعات چاہتے ہیں۔ 'پروڈکٹس' جہاں 'قیمت > 500' سے 'id' اور 'قیمت' کو منتخب کرنے کے لیے 'luxury_products' نامی CTE استعمال کریں۔ پھر اس CTE پر ایک اہم سوال چلائیں اور سب کچھ دکھائیں (*)۔
اشارہ دکھائیں۔
luxury_products AS (...) کے ساتھ شروع کریں پھر luxury_products سے * کو منتخب کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
ہم ایسے صارفین کو تلاش کرنا چاہتے ہیں جو جائزے لکھتے ہیں۔ ایک CTE 'جائزہ کنندگان' بنائیں جو 'جائزہ' سے منفرد (DISTINCT) 'customer_id' اقدار کو نکالے۔ پھر 'کسٹمرز' ٹیبل سے 'id'، 'first_name'، 'last_name' کو نکالیں اور id پر 'reviewers' CTE کے ساتھ \`JOIN\` کریں۔
اشارہ دکھائیں۔
مبصرین کے ساتھ AS (جائزوں سے DISTINCT customer_id کا انتخاب کریں) SELECT id, first_name, last_name FROM گاہک کے ساتھ شامل ہوں مبصرین ON customers.id = reviewers.customer_id;
3 کوششوں کے بعد حل دستیاب ہے۔