Merhaba Arkadaşlar Oracle da hiyerarşik sonuçlar dönderen sorguların nasıl yapıldığını dilim döndüğünce anlatmaya çalışacam.

hiç bir ilişkisel veri tabanı verileri hiyerarşik olarak kaydetmez. Ama oracle bize veritabanındaki kayıtlar üzerinde hiyerarşi sağlamamızı sağlayacak bi özellik vermiştir. Bir yada birden fazla tablolarınızda bulunan ilişkiselliği kullanarak bunları hiyerarşik şekilde ekran a getirebilirz.
Mesela Organizasyon Ağaç Şeması oluşturabilir, Soy ağacı oluşturabilir, Ürün ağacı , işletme operasyon şeması gibi hiyerarşi gerektiren şemaları bir sorgu ile oluşturabilirsiniz.

İlk önce örnek sorgu için tablomuzu oluşturalım

CREATE TABLE ORGANIZASYON
(
  SICIL   NUMBER,
  ADI     VARCHAR2(30),
  SOYADI  VARCHAR2(30),
  GOREVI  VARCHAR2(50),
  AMIRI   NUMBER
);
ve bu tablomuza örnek verimizi girelim.

Insert into ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI) Values    (121, 'Ahmet', 'Guven', 'Yonetim Kurulu Başkanı');
Insert into ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI)  Values   (199, 'Mehmet', 'Koru', 'Genel Müdür', 121);
Insert into ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI)  Values   (210, 'Kemal', 'Kılıç', 'Pazarlama Müdürü', 199);
Insert into ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI)  Values   (219, 'Polat', 'Alemdar', 'Satınalma Müdürü', 199);
Insert into ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI)  Values   (276, 'Mehmet', 'Karaman', 'Finans Müdürü', 199);
Insert into ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI)  Values   (286, 'Orhan', 'Ünlü', 'İnsan Kaynakları Müdürü', 199);
Insert into ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI)  Values   (291, 'Osman', 'Deniz', 'Üretim Müdürü', 199);
Insert into ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI)  Values   (420, 'Alper', 'Turan', 'Üretim Şefi', 291);
Insert into  ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI) Values   (428, 'Hakan', 'Burçak', 'Kalite Kontrol Şefi', 291);
Insert into  ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI) Values   (440, 'Seda', 'Öztürk', 'Satınalma Şefi', 219);
Insert into  ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI) Values   (444, 'Melike', 'Yılmaz', 'Muhasebe Şefi', 276);
Insert into  ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI) Values   (459, 'Halil', 'Ertuğrul', 'Kalite Kontol Mühendisi', 420);
Insert into  ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI) Values   (478, 'Sevda', 'Demir', 'Personel Memuru', 286);
Insert into  ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI) Values   (477, 'Nilgün', 'İşlek', 'Satış Sorumlusu', 210);
Insert into  ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI) Values   (498, 'Beyza', 'Güven', 'Müşteri Temsilcisi', 210);
Insert into  ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI) Values   (670, 'Fatma', 'Kaya', 'Müşteri Temsilcisi', 210);
Insert into  ORGANIZASYON   (SICIL, ADI, SOYADI, GOREVI, AMIRI) Values   (981, 'Fikret', 'Mavi', 'Laborant', 428);
COMMIT;
select * from organizasyon
dediğimizde bize resimdeki gibi veriler dönecek.


Bu basit bir organizasyon şemasıdır. Her kişinin Sicil Numarası vardır amir kısmında ise bağlı olduğu amirin sicil numarası vardır.

Şimdi sıra bu tabloyu hiyerarşik olarak sıralatmaya geldi
bunun için kullanacağımız komutlar
START WITH : Hiyerarşik yapının başlayacağı ifadeyi gösterir.
CONNECT BY PRIOR : Bu ifade ise master / detail ilişki kurulacak kolonları belirtir.
LEVEL : Dönen sonuçta hiyerarşik seviye yi gösterir.


örnek sql kodu ve sonucuna bakalım.
select sicil, adi, soyadi, gorevi, amiri, LEVEL from organizasyon 
START WITH amiri IS NULL
CONNECT BY PRIOR sicil = amiri





Gördüğünüz gibi artık sorgumuzda level (seviye) kolonu oluştu.
şimdi görsellik oluşturup sorgu sonucunu ağaç şeklinde gösterelim.


select LPAD(adi||'-'||soyadi, Length(adi||'-'||soyadi)+ LEVEL * 10 -10, '-') OrganizasyonSemasi 
from organizasyon 
START WITH amiri IS NULL
CONNECT BY PRIOR sicil = amiri



veya

select LPAD(gorevi, Length(gorevi)+ LEVEL * 10 -10, '-') OrganizasyonSemasi 
from organizasyon 
START WITH amiri IS NULL
CONNECT BY PRIOR sicil = amiri






Dilim döndüğünce anlatmaya çalıştım. Anlatığım bozukluğu için kusura bakmayın.
Konuyla ilgili görüş ve sorularınızı yazarsanız sevinirim.