Kodokon kodokon.com

CTE (WITH): जटिल क्वेरियों को पठनीय बनाना

WITH की मदद से अपनी क्वेरियों को नामित चरणों में व्यवस्थित करें और CTE को रूपांतरणों की एक पाइपलाइन की तरह जोड़ें।

7 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

तीन स्तर गहरी नेस्टेड एक सबक्वेरी अंदर से बाहर की ओर पढ़ी जाती है: अपठनीय और छह महीने बाद दोबारा देखना असंभव। CTE (Common Table Expression, यानी WITH क्लॉज़) पढ़ने का क्रम पलट देता है: आप हर मध्यवर्ती चरण को ठीक वैसे ही नाम देते हैं जैसे किसी फ़ंक्शन को देते, और क्वेरी ऊपर से नीचे पढ़ी जाती है। इस डेटासेट को sqliteonline.com या sqlite3 में लोड करें।

SQL
CREATE TABLE payments (
  id INTEGER PRIMARY KEY,
  customer TEXT NOT NULL,
  paid_at TEXT NOT NULL,
  amount REAL NOT NULL
);

INSERT INTO payments (customer, paid_at, amount)
VALUES
  ('alice', '2026-01-10', 120.0),
  ('bruno', '2026-01-22', 80.0),
  ('alice', '2026-02-05', 60.0),
  ('chloe', '2026-02-18', 200.0),
  ('bruno', '2026-03-03', 40.0),
  ('alice', '2026-03-15', 90.0),
  ('chloe', '2026-03-28', 150.0),
  ('bruno', '2026-04-09', 300.0);
इस पाठ के लिए डेटासेट।

मूल सिंटैक्स: WITH name AS (SELECT ...) के बाद मुख्य क्वेरी, जो name को एक साधारण टेबल की तरह उपयोग करती है। यहाँ, हम substr से तारीख में से महीना निकालकर मासिक राजस्व की गणना करते हैं (SQLite की तारीखें ISO 8601 टेक्स्ट हैं, जो किसी मानक के बजाय एक इंजन का चुनाव है)।

SQL
WITH monthly AS (
  SELECT substr(paid_at, 1, 7) AS month,
         SUM(amount) AS revenue
  FROM payments
  GROUP BY month
)
SELECT * FROM monthly ORDER BY month;
एक सरल CTE: एक नामित, पुनः प्रयोग योग्य चरण।

असली ताकत चेनिंग से आती है: एक ही WITH, अल्पविरामों से अलग किए गए कई CTE, जिनमें से हर एक अपने से पहले परिभाषित CTE को पढ़ सकता है। आप एक पाइपलाइन बनाते हैं: एग्रीगेट करें, एक सांख्यिकी की गणना करें, तुलना करें। यहाँ, हम उन महीनों को ढूँढते हैं जिनका राजस्व मासिक औसत से अधिक है (अपेक्षित: 2026-03 और 2026-04, औसत 260 होने के कारण)।

SQL
WITH monthly AS (
  SELECT substr(paid_at, 1, 7) AS month,
         SUM(amount) AS revenue
  FROM payments
  GROUP BY month
),
stats AS (
  SELECT AVG(revenue) AS avg_revenue
  FROM monthly
)
SELECT m.month, m.revenue,
       ROUND(s.avg_revenue, 1) AS avg_all
FROM monthly AS m
CROSS JOIN stats AS s
WHERE m.revenue > s.avg_revenue
ORDER BY m.month;
चेन किए गए CTE: stats, monthly को पढ़ता है, अंतिम SELECT दोनों को पढ़ता है।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. आप एक ही क्वेरी में कई CTE कैसे घोषित करते हैं?
    • हर CTE से पहले एक WITH कीवर्ड
    • एक ही WITH, CTE अल्पविरामों से अलग किए गए
    • उन्हें एक-दूसरे के अंदर नेस्ट करके
  2. क्या कोई CTE उसी WITH के किसी अन्य CTE को पढ़ सकता है?
    • नहीं, हर CTE अलग-थलग होता है
    • हाँ, लेकिन केवल उन्हें जो इससे पहले परिभाषित हैं
    • हाँ, किसी भी क्रम में
  3. नेस्टेड सबक्वेरी की तुलना में CTE का मुख्य लाभ क्या है?
    • यह हमेशा तेज़ होता है
    • यह एक स्थायी, पुनः प्रयोग योग्य टेबल बनाता है
    • यह हर चरण को नाम देता है और प्रवाह को पठनीय तथा परीक्षण योग्य बनाता है