Google Analytics İzleme

02 Eylül 2010

Oracle (Connect By) soyağacı sorgulama

Çoğu zaman ilişkili tablolarımızda tablo sayısı  bir kaç taneyi geçebiliyor  ve genelde bunların sonuna ya da başına _ALT koyuyoruz (:  ama soyun sınırsız olduğunu düşündüğümüzde  bunu tek tabloda tutup  ATA_ID ya da PARENT_ID gibi kendisinin atasıyla ilişkilendirmek daha mantıklı oluyor. bu gibi durumlarda Recursive işlemlere ihtiyac duyuyoruz . ama bunu recursive olarak dataya sormak yerine  recursive işlemini dataya yapmak daha da mantıklıdır. bu işlemi yapan cümleciğimizin yapısı da  CONNECT BY PRIOR – START WITH anahtar  cumleciklerinden oluşuyor ilk once bir soyağacı tablosu örneği vermek istiyorum . ailem diye bir tablo oluşturalım

0
1
2
3
4
CREATE TABLE ailem(
tckimlik int PRIMARY KEY,
adi VARCHAR(30),
baba_tc int
);

ailenin her ferdini bu tabloda ilişkili olarka tutabiliriz  baba_tc kendisinin babası olan kaydın tckimlik alanına eşit olacaktır.

şimdi kayıtlarımızı ekleyelim

0
1
2
3
4
5
6
7
INSERT INTO ailem (tckimlik,adi) VALUES (1,'Ömer');
INSERT INTO ailem (tckimlik,adi,baba_tc) VALUES (2,'Yahya',1);
INSERT INTO ailem (tckimlik,adi,baba_tc) VALUES (3,'Tufan',2);
INSERT INTO ailem (tckimlik,adi,baba_tc) VALUES (4,'Savaş',2);
INSERT INTO ailem (tckimlik,adi,baba_tc) VALUES (5,'Diyar',2);
INSERT INTO ailem (tckimlik,adi,baba_tc) VALUES (6,'Barbaros',2);
INSERT INTO ailem (tckimlik,adi,baba_tc) VALUES (7,'Yeğenim',6);
INSERT INTO ailem (tckimlik,adi,baba_tc) VALUES (8,'Çocuğum (:',3);

yandaki tablodan da gördüğümüz gibi  baba_tc alanı ile  kaydın babasını belirledik. bu iki sütun yardımı ile ağaç yapısnı oluşturabileceğimiz bir tablo yapımız oldu.

şimdi ornek sorguyu yazalım

0
1
2
SELECT  adi,tckimlik,baba_tc
FROM ailem
CONNECT BY PRIOR tckimlik=baba_tc

bu sorgu sonucunda bize tüm kayıtlar ve varsa alt alt kayıtları da dönecektir. örnek resim :

kayıtlar baba_tc ile geldi ama bu ne kadar işimize yarar (: her kayıt baba olarak ve her kaydın da varsa cocuğu geldi baba_tc ile zaten bu tabloda bir ilişki kurabiliyorduk bu bizim için bi anlam ifade etmedi conenct by sorgularında kullanabileceğimiz bir anahtar daha LEVEL  bu da bize kaydın derinliğini ya da nesil katını verir diyelim.

örnek sorgu

0
1
2
SELECT  adi,tckimlik,baba_tc,LEVEL
FROM  ailem
CONNECT BY PRIOR tckimlik=baba_tc

level bize derinlik verdi. resimdeki orneğe bakalım

leveli 1 olan  ilk atalar 2- 3 diye arttıkça torun oluyor.

buna bir de leveli kullanarak anlaşılabilir bir görüntü verebiliriz. lpad fonksiyonunu kullanarak  isimlerin başına “level”  kadar ” – ” attıralım..

0
1
2
3
SELECT  LPAD('-',LEVEL,'-')|| adi sahis,tckimlik,baba_tc,LEVEL
FROM  ailem
START WITH baba_tc IS NULL
CONNECT BY PRIOR tckimlik=baba_tc

boylelikle kayıtlar daha anlaşılır oldu  kim kimin atası net olarak görülebiliyor.

şimdi bu kayıtları üst kaydı göstererek tek satırda göstermeye çalışalım. bunun için de  SYS_CNNECT_BY_PATH() fonksiyonunu kullanacağız.

örnek sorgu :

0
1
2
3
SELECT tckimlik,adi, SYS_CONNECT_BY_PATH(adi, '->') AS konum
FROM ailem
CONNECT BY PRIOR tckimlik=baba_tc
START WITH baba_tc IS NULL

tablo :

şimdi ise   her kaydı dosya yolu gibi PATH ‘i ile beraber  dededen ->toruna ikişkisiyle göstermeyi başardık  (:
iyi çalışmalar…


Alıntı: http://www.tufyta.com/oracle-connect-by-soyagaci-sorgulama



Hiç yorum yok: