ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 7 · 4లో పాఠం 1కోర్సులో 25/57~12 min
మాడ్యూల్ పాఠాలు (1/4)

CTE: తో బహుళ-దశల ప్రశ్నలు

నిజమైన ప్రశ్నలు పెరుగుతాయి: మూడు JOINs, a GROUP BY, సబ్‌క్వెరీ, మరొక ఉపప్రశ్న… మరియు అవి చదవలేనివిగా మారాయి. CTEలు ("కామన్ టేబుల్ వ్యక్తీకరణలు", 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లో సబ్‌క్వెరీ (చట్టబద్ధమైనది, కానీ శబ్దం ఎక్కువ).

క్యాస్కేడ్‌లో బహుళ CTEలు

మీరు కామాలతో వేరు చేయబడిన బహుళ CTEలను నిర్వచించవచ్చు మరియు ప్రతి ఒక్కటి సూచించవచ్చు మునుపటి వాటికి:

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 vs సబ్‌క్వెరీ: ఏది ఎప్పుడు ఉపయోగించాలి

CTEలు ప్రకాశిస్తాయి:

  • అదే ఉపప్రశ్న ప్రధాన ప్రశ్నలో రెండు లేదా అంతకంటే ఎక్కువ సార్లు ఉపయోగించబడుతుంది;
  • మీరు పేరు పెట్టబడిన దశల్లో ** నిర్మాణాన్ని** స్పష్టంగా చేయాలనుకుంటున్నారు (స్వీయ-డాక్యుమెంటింగ్);
  • అవి ** పునరావృత CTEల కోసం ** ముందస్తు అవసరం** (WITH RECURSIVE, ఈ మాడ్యూల్‌లోని తదుపరి పాఠం).

ఇన్‌లైన్ సబ్‌క్వెరీ ఒక్కసారి మాత్రమే ఉపయోగించిన దశకు మరింత సంక్షిప్తంగా ఉంటుంది.

దీనిని ప్రయత్నించండి

వ్యాయామం#sql.m7.l1.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

డెలివరీ చేయబడిన ఆర్డర్‌లపై ప్రతి కస్టమర్‌కు మొత్తం ఖర్చు (SUM(పరిమాణం * యూనిట్_ధర)) గణించే 'total_spent' అనే CTEని ఉపయోగించండి. ఆపై ప్రధాన ప్రశ్నలో టాప్ 3 ఖర్చు చేసేవారి కోసం ఇమెయిల్ మరియు మొత్తం చూపండి. మొత్తం అవరోహణ ద్వారా ఆర్డర్, 3కి పరిమితి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

CTE మొత్తం పరిమాణం లోపల * యూనిట్_ధర. ప్రధాన ప్రశ్నలో idలో కస్టమర్‌లతో చేరండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం సమీక్షించండి

వ్యాయామం#sql.m7.l1.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

మునుపటి వ్యాయామం వలె అదే 'మొత్తం_వ్యయం' CTE. ప్రధాన క్వెరీ షోలో సగటు ఖర్చు కంటే ఎక్కువ ఖర్చు చేసిన కస్టమర్‌ల కోసం ఇమెయిల్ మరియు మొత్తం (కనీసం ఒక డెలివరీ ఆర్డర్ ఉన్న కస్టమర్‌లందరికీ). మొత్తం అవరోహణ ద్వారా ఆర్డర్ చేయండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

WHEREలో స్కేలార్ సబ్‌క్వెరీ: మొత్తం_వెచ్చించిన నుండి AVG(మొత్తం)ని ఎంచుకోండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది