Hiyerarşik Sorgularda LEVEL, SYS_CONNECT_BY_PATH ve CONNECT_BY_ROOT Kullanımı

2015-10-30 18:21:10


Oracle Veritabanında Hiyerarşik Sorgular yazımda Oracle veritabanında hiyerarşik sorgulara giriş yapmıştım. Hiyerarşik verilerin (parent-child ilişkisi olan veriler) tutulduğu bir tabloda nasıl sorgulama yapılacağından bahsetmiştim. Şimdi hiyerarşik sorgularda işimize yarayacak bazı özelliklere ve işlevlere göz atalım. Örneğin; önceki yazımda ilk sorguya bakarsak EMPLOYEES tablosundaki tüm çalışanları kendi yöneticisinin altında olacak şekilde hiyerarşik bir şekilde sorgulamıştık. Şimdi her çalışanın kaçıncı seviyede olduğunu yazdıralım.


SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, MANAGER_ID, LEVEL as SEVIYE
FROM EMPLOYEES
START WITH MANAGER_ID IS NULL
CONNECT BY MANAGER_ID =PRIOR EMPLOYEE_ID;


LEVEL sözde sütunu (pseudocolumn) ile kaydın hiyerarşideki seviyesini elde edebiliyoruz. LEVEL sütunu hiyerarşide en üstte bulunan kayıt için 1 değerini verir.

Şimdi çalışanların organizasyon hiyerarşisini bir sütunda yazdıralım. Yani en üst düzey yöneticiden çalışanın kendisine kadar olan yolu yazdıralım. 

SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, MANAGER_ID, LEVEL as SEVIYE, SYS_CONNECT_BY_PATH(FIRST_NAME,'/') ORGANIZASYON
FROM EMPLOYEES
START WITH MANAGER_ID IS NULL
CONNECT BY MANAGER_ID =PRIOR EMPLOYEE_ID;

SYS_CONNECT_BY_PATH ile en üstten çalışanın kendisine kadar olan organizasyon hiyerarşisini araya / koyarak kolayca yazdırabildik. SYS_CONNECT_BY_PATH fonksiyonunun ilk parametresi yazdırmak istediğimiz değer, ikinci parametresi ise ayraçtır. 

Hiyerarşik sorgularda işe yarayabilecek bir diğer özellik de CONNECT_BY_ROOT operatörüdür. Bu operatör ile hiyerarşinin en üstündeki kaydın sütunlarına ulaşabiliriz. Örneğin; her çalışanın yanına CEO'nun adını yazdırabiliriz.

SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, CONNECT_BY_ROOT(FIRST_NAME||' '||LAST_NAME) AS CEO
FROM EMPLOYEES
START WITH MANAGER_ID IS NULL
CONNECT BY MANAGER_ID =PRIOR EMPLOYEE_ID;

emp6


Bu yazımda hiyerarşik sorgularda LEVEL, SYS_CONNECT_BY_PATH ve CONNECT_BY_ROOT kullanımını anlatmaya çalıştım. Bu 3 özelliği bildiğimizde işleri çok kolaylaştırmaktadır. Eğer bunların varlığından haberdar olmazsak bizi çok zorlayacak sorgularla uğraşmak zorunda kalabiliriz :)