5 Aralık 2010 Pazar

Sql de ağaç yapısı ( CONNECT BY PRIOR )

Eğer tablomuz hiyerarşik bir veri yapısına (Örneğin Tree yapısı) sahip ise, verinizi hiyerarşisindeki sırasına göre getirmeniz mümkün. Aşağıdaki gibi bir veri yapımız oldugunu düşünelim.
İsterseniz SQL ifadeleri üzerinden gidelim ve sonuçlarını inceleyelim. Yukarıdaki yapıyı Oracle’ daki bir tabloda şu şekilde tutalım.
SQL 1 :
SELECT name, id, parent FROM test_table

Görüldüğü gibi veri yapımızı soyağacı yapımıza göre tasarladık…
SQL 2 :SELECT name, id, parent
FROM test_table
CONNECT BY PRIOR id = parent;

CONNECT BY PRIOR ile her veri satırına ait olası tüm ağaç ve alt ağaç yapılarını veren bir sonuç kümesi mevcut. Bu sonuç biraz karmaşık gelebilir. Bir başlangıç noktası belirtmek istersek;
SQL 3 :SELECT name, id, parent
FROM test_table
CONNECT BY PRIOR id = parent
START WITH parent = 0
START WITH ifadesi ile “0″ yani ağacımızın en tepesinde bulunan Büyükannemize ait alt kırılımları görüyoruz. Bu sonuç kümesini daraltmış olsada karmaşıklıgı ortadan kaldırmadıgını varsayalım ve verimizi biraz daha anlandırmak adına Oracle ın nimetlerinden faydalanalım;
SQL 4 :SELECT name, id, parent, SYS_CONNECT_BY_PATH(name, ‘ > ‘) AS yol
FROM test_table
CONNECT BY PRIOR id = parent
START WITH parent = 0;

Yol sütunumuzdan da anlaşılacagı gibi Ayşe büyükannemizin kendinden ufak olan aile fertlerini soyagacımız da ki yapıya uygun olacak şekilde anlamlaştırdık. Peki PRIOR ifadesinin yerini değiştirirsek ne olur ?

SQL 5 :SELECT name, id, parent, SYS_CONNECT_BY_PATH(name, ‘ > ‘) AS yol
FROM test_table
CONNECT BY id = PRIOR parent
START WITH parent = 0;

Demek ki PRIOR ifadesi CONNECT BY ile verilen şartta kendinden önceki ağaç seviyelerini baz alacagını bize veriyor. Burada da PARENT=0 diye bir başlangıç noktası verdiğimiz  ve PARENT alanını baz aldıgımız için kendi ve kendinden öncesini getirmiş oldu. Sql ifademizi biraz daha renklendirelim;
SQL 6 :SELECT name, id, parent, CONNECT_BY_ISLEAF AS yaprak, LEVEL AS seviye
FROM test_table t
START WITH parent = 0
CONNECT BY PRIOR id = parent
Bu son ifade de yeralan CONNECT_BY_ISLEAF ifadesi ile ilgili kaydın ağaç yapımızda ki son veri (Bir ağaçtaki son uzuv yaprak olmasından feyz alınarak) ise de “1″ değerini, kendine ait alt bir verisi varsa da “0″ degerini döndürür. Bir diğer ifade olan LEVEL ile de büyükannemize olan birim uzaklık değerini alıyoruz.

İyi Çalışmalar…






Share:

7 yorum:

  1. Elinize saglik cok anlasilr ve guzelbir makale olmus

    YanıtlaSil
  2. Amacım kendim ve ziyaretçilerim için yararlı olacağını düşündüğüm her bilgiyi paylaşmak, sizlerinde geri bildirimleri daha daha bir şevk veriyor. Teşekkürler.

    YanıtlaSil
    Yanıtlar
    1. Yukarıda anlattığınız aynı yapıyı (CONNECT BY PRIOR) MS SQL içerisinde nasıl sağlayabiliriz? Saygılarımla

      Sil
  3. Tabloya gömülü birden fazla aile yapısı nasıl sorgulanabilir? Mesela AileID diye bir alanımız var ve her aileyi kendi içerisinde gruplayacağız?

    YanıtlaSil
    Yanıtlar
    1. Gruplama demeyelim de, aynı tabloda tutulan farklı ailelere dair veriyi çekebilmek için, şöyle bir kullanım söz konusuymuş (Örnek Tabloda AileID alanının bulunduğunu varsayalım) :

      WHERE AileID = 1
      CONNECT BY
      PRIOR AileID = 1
      PRIOR id = parent
      START WITH parent = 0

      Sil
  4. Örnek veri gönderebilirseniz yardımcı olmaya çalışırım.

    YanıtlaSil

Blog Arşivi