در این بخش قصد دارم به معرفی پرس و جوهای بازگشتی (recursive query) پرداخته و همچنین محل کاربرد ، نحوه کار ، قابلیت ها ، و توابعی قابل استفاده در پرس و جوهای بازگشتی را معرفی کنم.
استفاده از پرس و جوهای بازگشتی برای داده هایی امکان پذیر است که ارتباط مابین سطر والد و فرزند در هر سطر مشخص شده باشد لطفا به داده های جدول زیر دقت نمایید
✔️هر سطر از جدول فوق مشخص کننده اطلاعات کارمند از قبیل شناسه کارمند ، شناسه مدیر ، نام کارمند و نام خانوادگی کارمند است
✔️به کارمند شماره 101 (Neena Kochhar) توجه کنید ، همانطور که مشاهده میکنید شناسه مدیر این کارمند 100 (Steven King) میباشد
✔️کارمند شماره 102 (Lex De Haan) دارای مدیری با شناسه 100 (Steven King) میباشد ، نتیجه میگیریم که کارمندان 101 و 102 دارای مدیر یکسانی هستند (100)
✔️از مطالب فوق میتوانیم به این نتیجه برسیم که هر مدیر خود یک کارمند است و اگر بخواهیم نام و نام خانوادگی مدیر مستقیم هر کارمند را بدست آوریم باید جدول را با خودش join کنیم ، پرس و جو فوق و خروجی آن به ضورت زیر است
select emp.employee_id,
,emp.manager_id
,emp.first_name emp_first_name
,emp.last_name emp_last_name
,mng.first_name mng_first_name
mng.last_name mng_last_name
from employees emp
left join employees mng
on emp.manager_id = mng.employee_id
order by emp.employee_id
همانطور که مشاهده میکنید خروجی پرس و جوی فوق تنها مدیر مستقیم هر کارمند را استخراج میکند، برای استخراج مدیر مدیر هر کارمند باید از join دیگری با جدول کارمندان استفاده کرد ، همچنین برای مدیر دیگری باید دوباره join کرد
سوال: برای استخراج تمامی مدیران کارمند چند بار باید جدول کارمندان را با خودش join کنیم ؟؟؟
سوال: با توجه به اینکه ورود اطلاعات توسط کاربران انجام میشود امکان شناسایی سطوح مدیران امکان پذیر است؟؟؟
سوال: عملکرد پرس و جوهایی که چندین join دارد از لحاظ کارایی چگونه است؟؟؟
راهکار پاسخ به سوالات فوق استفاده از پرس و جوهای بازگشتی است ، نحوه نگارش پرس و جوهای بازگشتی به صورت زیر است
select field1 , field2 , ….
from tbl_name
[where … ]
start with …..
connect by prior child_id_field_name = parent_id_field_name
مثال استفاده از پرس و جوی بازگشتی به صورت زیر میباشد
select emp.employee_id,
emp.manager_id,
emp.first_name,
emp.last_name,
lpad(‘ ‘, 4 * (level – 1)) || emp.first_name || ‘ ‘ || emp.last_name mng_fl_name
from employees emp
from employees emp
connect by prior emp.employee_id = emp.manager_id
خروجی پرس و جوی فوق بطور کامل در فایل زیر می باشد
برای مشاهده کامل مطلب کلیک کنید