နားလည်ထားရမယ့် အချက်
Subquery က query အတွင်း query တစ်ခုဖြစ်ပြီး scalar value၊ row set သို့ existence စစ်ချက်အဖြစ်သုံးနိုင်ပါတယ်။ `EXISTS` က match ရှိမရှိသာလိုသည့်အခါ intent ရှင်းပြီး duplicate ပြဿနာမဖြစ်စေပါဘူး။ CTE က query ကိုအမည်ပေးထားသောအဆင့်များအဖြစ်ဖတ်ရလွယ်စေသော်လည်း performance ကို အလိုအလျောက်ကောင်းစေမည့် magic မဟုတ်ပါ။
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
Lesson အနည်းဆုံးတစ်ခုရှိသော published tutorial ကို `EXISTS` ဖြင့်ရွေးမယ်။ နောက် query မှာ enrollment count ကို CTE ဖြင့်တွက်ပြီး popular tutorial များကို catalog metadata နဲ့ချိတ်မယ်။
အတူတူ စမ်းရေးကြည့်မယ်
SELECT t.tutorial_id, t.title
FROM app.tutorials t
WHERE t.is_published
AND EXISTS (
SELECT 1 FROM app.lessons l
WHERE l.tutorial_id = t.tutorial_id
);
WITH enrollment_totals AS (
SELECT tutorial_id, count(*) AS enrollments
FROM app.enrollments
GROUP BY tutorial_id
)
SELECT t.title, e.enrollments
FROM enrollment_totals e
JOIN app.tutorials t USING (tutorial_id)
WHERE e.enrollments >= 10;Lesson ပါသော tutorial နှင့် popular tutorial lists နှစ်မျိုးရမည်။၅ မိနစ် စမ်းကြည့်
Progress row မရှိသေးသော enrollment များကို `NOT EXISTS` ဖြင့်ရှာပါ။
သတိလေးတစ်ချက်
`NOT IN` subquery ထဲ NULL ပါနိုင်ရင် မျှော်လင့်မထားသော result ရနိုင်ပါတယ်။ Anti-join အတွက် `NOT EXISTS` ကိုစဉ်းစားပါ။
PostgreSQL — WITH Queries — PostgreSQL Global Development Group