İ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;
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
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;
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;
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
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…
Teşekkürler...
YanıtlaSilElinize saglik cok anlasilr ve guzelbir makale olmus
YanıtlaSilAmacı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ıtlaSilYukarıda anlattığınız aynı yapıyı (CONNECT BY PRIOR) MS SQL içerisinde nasıl sağlayabiliriz? Saygılarımla
SilTabloya 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ıtlaSilGruplama 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) :
SilWHERE AileID = 1
CONNECT BY
PRIOR AileID = 1
PRIOR id = parent
START WITH parent = 0
Örnek veri gönderebilirseniz yardımcı olmaya çalışırım.
YanıtlaSil