Ç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 | CREATE TABLE ailem( |
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 | INSERT INTO ailem (tckimlik,adi) VALUES (1,'Ömer'); |
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 | SELECT adi,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 | SELECT adi,tckimlik,baba_tc,LEVEL |
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 | SELECT LPAD('-',LEVEL,'-')|| adi sahis,tckimlik,baba_tc,LEVEL |
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 | SELECT tckimlik,adi, SYS_CONNECT_BY_PATH(adi, '->') AS konum |
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:
Yorum Gönder