ORACLE SQL HİYERARŞİK SORGU

Share Button

Hiyerarşik sorgular çoğu uygulamada hayatımızı daha kolay hale getiriyor. Bu yazıda en basitinden hiyerarşik sorgu anlatım ve örnekleri olacaktır.

Hiyerarşik sorgular bir tablo veya bir sorgu içerisindeki satırları birbirlerine belli koşullar ve başlangıç noktaları baz alınarak bağlamak için kullanılır. En çok kullanılan somut örneklerinden biri yönetici-çalışan örneğidir.

Aşağıdaki ddl ve dm içeren sql scripti örneğimizde kullanacağımız tablo ve kısıtları oluşturup, örnek verilerler eklemektedir. Tablomuz çalışanların tutulduğu tablo olmakta olup calisan_id sütunu birincil anahtardır. Dikkat edilmesi gereken diğer sütun ise yonetici_id sütunudur. Bu sütun hangi çalışanın hangi çalışana bağlı olduğu bilgisini tutar.

Aşağıdaki resimde tablomuza eklediğimiz verinin hiyerarşik göstergesi yer almaktadır.

Çalışan Hiyerarşi

Çalışan Hiyerarşi

Oracle’ın bize sağladığı analitik fonksiyonlar sayesinde normal sql içerisinde bu hiyerarşiyi özetleme imkanımız mevcuttur. Bu bağlamda aşağıdaki sql keyword, fonksiyon ve kavramlarını anlamak yararlı olacaktır.

start with: Hiyerarşik sorgularda belli bir başlangıç noktası belirlenmelidir. Bu gidiş yönüne göre en alt veya en üst olabilirken, orta bir noktadan da başlamak mümkündür. Bu keyword koşul belirtilerek de kullanılabilir.

connect by: Sorgu içerisinde hangi hiyerarşi ilişkisini belirleyen eşitliktir. Yine start with gibi bu keyword de koşul belirtilerek kullanılabilir.

prior: connect by yaparken eşitliğin iki tarafında da kullanılabilinir. Prior hiyerarşinin yönüne göre her zaman gidilen tarafa doğru olmalıdır.

sys_connect_by_path: Bu fonksiyon select içerisinde yer alan sütunlar gibi kullanılır. İki parametre almaktadır.

connect_by_root: Bu fonksiyon da select içerisinde yer alan sütunlar gibi kullanılır. Bu fonksiyonu kullanırken başlangıç noktası belirtilmez zira kendisi bütün başlangıç noktalarını baz alarak sorguyu getirir.

level: Hiyerarşinin seviyesini çeker. Sütun gibi kullanılır.

Bu kavramları anladıktan sonra aşağıdaki SQL örneklerine geçebiliriz.

Aşağıdaki örnekte alt seviyede yer alan 7 numaralı ID’ye sahip çalışan başlangıç noktası olarak belirlenmiştir. Yani hiyerarşide gidiş yönümüz yukarı doğrudur, dolayısıyla prior keyword’ünün connect by içerisinde yönetici tarafında yer alması gerekir.

Sonuç:

Şimdi başlangıç noktamızı en tepeye yani yöneticisi olmayan kişiye 1 numaralı ID’ye sahip çalışana çekiyoruz. Fakat bu sefer connect by yaparken prior’ı yönümüz aşağı doğru olduğu için eşitliğin çalışan tarafına kaydırıyoruz.

Sonuç:

 

Son olarak connect_by_root örneği için aşağıdaki SQL çalıştırılır. Dikkat edilmesi gereken nokta başlangıç noktası yani start with belirtilmemiştir.

Sonuç: