మాడ్యూల్ పాఠాలు (1/4)
CTE: తో బహుళ-దశల ప్రశ్నలు
నిజమైన ప్రశ్నలు పెరుగుతాయి: మూడు JOINs, a GROUP BY, సబ్క్వెరీ,
మరొక ఉపప్రశ్న… మరియు అవి చదవలేనివిగా మారాయి. CTEలు ("కామన్ టేబుల్
వ్యక్తీకరణలు", WITH నిబంధన) మీకు పేరు ఇవ్వడానికి
ఇంటర్మీడియట్ దశ మరియు ప్రధాన ప్రశ్నలో పట్టిక వలె దాన్ని ఉపయోగించండి.
ప్రాథమిక వాక్యనిర్మాణం
WITH nome_cte AS (
SELECT … -- query interna
)
SELECT … -- query principale, usa nome_cte come fosse una tabella
FROM nome_cte;CTE చెల్లుబాటు అయ్యేది దానిని అనుసరించే ప్రశ్నకు మాత్రమే: ఇది మనుగడలో లేదు అమలు.
ఉదాహరణ
అత్యధికంగా ఖర్చు చేసిన 3 కస్టమర్లను కనుగొనండి (డెలివరీ చేసిన ఆర్డర్ల మొత్తం):
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లను నిర్వచించవచ్చు మరియు ప్రతి ఒక్కటి సూచించవచ్చు మునుపటి వాటికి:
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, ఈ మాడ్యూల్లోని తదుపరి పాఠం).
ఇన్లైన్ సబ్క్వెరీ ఒక్కసారి మాత్రమే ఉపయోగించిన దశకు మరింత సంక్షిప్తంగా ఉంటుంది.
దీనిని ప్రయత్నించండి
డెలివరీ చేయబడిన ఆర్డర్లపై ప్రతి కస్టమర్కు మొత్తం ఖర్చు (SUM(పరిమాణం * యూనిట్_ధర)) గణించే 'total_spent' అనే CTEని ఉపయోగించండి. ఆపై ప్రధాన ప్రశ్నలో టాప్ 3 ఖర్చు చేసేవారి కోసం ఇమెయిల్ మరియు మొత్తం చూపండి. మొత్తం అవరోహణ ద్వారా ఆర్డర్, 3కి పరిమితి.
సూచనను చూపించు
CTE మొత్తం పరిమాణం లోపల * యూనిట్_ధర. ప్రధాన ప్రశ్నలో idలో కస్టమర్లతో చేరండి.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
వ్యాయామం సమీక్షించండి
మునుపటి వ్యాయామం వలె అదే 'మొత్తం_వ్యయం' CTE. ప్రధాన క్వెరీ షోలో సగటు ఖర్చు కంటే ఎక్కువ ఖర్చు చేసిన కస్టమర్ల కోసం ఇమెయిల్ మరియు మొత్తం (కనీసం ఒక డెలివరీ ఆర్డర్ ఉన్న కస్టమర్లందరికీ). మొత్తం అవరోహణ ద్వారా ఆర్డర్ చేయండి.
సూచనను చూపించు
WHEREలో స్కేలార్ సబ్క్వెరీ: మొత్తం_వెచ్చించిన నుండి AVG(మొత్తం)ని ఎంచుకోండి.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది