Recursive query using CTEs
Ushbu qo'llanmada siz Rekursiv umumiy jadval ifodalari yoki CTE-lardan foydalangan holda PostgreSQL rekursiv so'rovi haqida bilib olasiz.
PostgreSQL so'rovda foydalanish uchun yordamchi bayonotlar yaratish imkonini beruvchi WITH
bayonotini taqdim etadi.
Ushbu bayonotlar ko'pincha umumiy jadval ifodalari(common table expressions
) yoki CTE
deb ataladi. CTElar faqat so'rovni bajarish paytida mavjud bo'lgan vaqtinchalik jadvallarga o'xshaydi.
Rekursiv so'rov - bu rekursiv CTE ga tegishli so'rov. Rekursiv so'rovlar tashkiliy tuzilma, materiallar ro'yxati va boshqalar kabi ierarxik ma'lumotlarni so'rash kabi ko'p holatlarda foydalidir.
Quyida rekursiv CTE sintaksisi tasvirlangan:
Rekursiv CTE uchta elementga ega:
Rekursiv bo'lmagan atama: rekursiv bo'lmagan atama CTE tuzilmasining asosiy natijalar to'plamini tashkil etuvchi CTE so'rovi ta'rifidir.
Rekursiv atama: rekursiv atama
UNION
yokiUNION ALL
operatori yordamida rekursiv bo'lmagan atama bilan birlashtirilgan bir yoki bir nechta CTE so'rov ta'riflari. Rekursiv atama CTE nomining o'ziga ishora qiladi.Tugatishni tekshirish: oldingi iteratsiyadan hech qanday satr qaytarilmasa, rekursiya to'xtaydi.
PostgreSQL rekursiv CTE ni quyidagi ketma-ketlikda bajaradi:
Asosiy natijalar toʻplamini (R0) yaratish uchun rekursiv boʻlmagan atamani bajaradi
Ri+1 natija toʻplamini chiqish sifatida qaytarish uchun kirish sifatida Ri bilan rekursiv atamani bajaradi.
Bo'sh to'plam qaytarilmaguncha 2-bosqichni takrorlanadi. (tugatishni tekshirish)
R0, R1, … Rn natijalar toʻplamining
UNION
yokiUNION ALL
boʻlgan yakuniy natijalar toʻplamini qaytaradi.
PostgreSQL rekursiv so'rovlar misoli
PostgreSQL rekursiv so'rovini namoyish qilish uchun yangi jadval yaratamiz.
employees
jadvali uchta ustundan iborat: employee_id
, manager_id
, va full_name
. manager_id
ustuni xodimning menejer identifikatorini belgilaydi.
Quyidagi bayonot employees
jadvaliga namunaviy ma'lumotlarni kiritadi.
Quyidagi soʻrov 2-identifikatorli menejerning barcha boʻysunuvchilarini qaytaradi.
U qanday ishlaydi:
Rekursiv CTE, subordinatlar, bitta rekursiv bo'lmagan atama va bitta rekursiv atamani belgilaydi.
Rekursiv bo'lmagan atama identifikator 2 bo'lgan xodim bo'lgan R0 asosiy natija to'plamini qaytaradi.
Rekursiv atama xodim identifikatorining 2-to'g'ridan-to'g'ri bo'ysunuvchi(lar)ini qaytaradi. Bu xodimlar jadvali va CTE bo'ysunuvchilari o'rtasida qo'shilish natijasidir. Rekursiv atamaning birinchi iteratsiyasi quyidagi natijalar to'plamini qaytaradi:
PostgreSQL rekursiv atamani qayta-qayta bajaradi. Rekursiv a'zoning ikkinchi iteratsiyasi kirish qiymati sifatida yuqoridagi natija to'plamidan foydalanadi va bu natijalar to'plamini qaytaradi:
Uchinchi iteratsiya bo'sh natijalar to'plamini qaytaradi, chunki 16, 17, 18, 19 va 20 identifikatorli xodimga hisobot beradigan xodim yo'q.
PostgreSQL rekursiv bo'lmagan va rekursiv atamalar tomonidan yaratilgan birinchi va ikkinchi iteratsiyalardagi barcha natijalar to'plamlarining birlashmasi bo'lgan yakuniy natijalar to'plamini qaytaradi.
Ushbu qo'llanmada siz PostgreSQL rekursiv so'rovlarini yaratish uchun rekursiv CTE-lardan qanday foydalanishni o'rgandingiz.
Last updated