2012-12-01 16 views
5

Verileri şimdi çekebilirim, ancak büyük veri kümeleri için sorguyu en iyi duruma getirmenin daha iyi bir yolu olup olmadığını merak ediyorum.Hiyerarşik Sorgu Çocukları, Ebeveynleri ve Kardeşleri Çekme İhtiyaçları

http://sqlfiddle.com/#!4/0ef0c/5

Böylece temelde sorgu verilen bir org kimliği tedarik edebilmek istiyoruz ve bunun yinelemeli onun anne, onun çocukları, onun kardeşleri ve teyzeler ve amcalar çekmelidir. Ve o org hiyerarşisiyle ilişkilendirilmiş herhangi bir Faaliyet'i çekin.

Org1 en üst düzey kuruluştur, ancak boş bir ebeveyni olabilir veya olmayabilir.

Temel olarak, çocukları ve ana bilgisayarı çekmek için yukarı ve aşağı bir sorgu yapıyordum, ancak yalnızca başka bir sorgu ekleyerek kardeşleri alıyor gibi görünebilir. Sonunda bir arkadaşın yardımıyla başka bir sorguya ulaşmış, ancak çok büyük veri kümeleri (4-5k Faaliyetler).

Herhangi bir fikir büyük takdir edilecektir.

+0

Bir keman oluşturma zorluğuna gittiyseniz, bir bağlantı kullanışlı olur. – Laurence

+0

Bunun için üzgünüz. http://sqlfiddle.com/#!4/5310d/5/0 –

+0

Ya, net olmaya yardımcı olur. Sonuç olarak, bu, çektiğinize yeni bilgi eklediğiniz üçüncü zamandır. Unut gitsin. – REW

cevap

0

Kuruluşunuz varsa yapı kesinlikle hiyerarşiktir, sonra bu yaklaşımı kullanabilirsiniz:

Dezavantajı, kuruluş yapısının her güncelleştirmesinde dizini güncellemeniz gerektiğidir. Ancak org yapıları genellikle daha sık okunur ve daha sonra modifiye edilir. Yani IMHO bu hile yapmalı.

0

Bunu yapmanın anahtarı "yinelemeli" kelimedir. Bunu yapmak için kendisini çağıran bir prosedür oluşturun. Bu, ebeveynler için bir örnektir, ancak girişler arasında gezinmek için bir imleci kullandığı için, bunları ve özyineleme içeren diğer ilişkileri bulmak için bunu nasıl kullanacağınız açık olmalıdır.

CREATE OR REPLACE PROCEDURE find_parents( 
    org_id NUMBER, 
    lvl NUMBER DEFAULT 1) AS 

    c_parent table1.id%TYPE; 
    c_name table1.name%TYPE; 
    CURSOR c_parents (c_id table1.id%TYPE) IS 
    SELECT parent, name FROM table1 WHERE (id = c_id); 

    BEGIN 
    dbms_output.put('-'); 
    OPEN c_parents(org_id); 
    LOOP 
     FETCH c_parents INTO c_parent, c_name; 
     EXIT WHEN c_parents%notfound; 
     dbms_output.put_line('Level ' || lvl || ' parent: [ID: ' || c_parent || ', NAME: ' || c_name || ']'); 
     find_parents(c_parent, lvl + 1); 
    END LOOP; 
    CLOSE c_parents; 
    END; 
+0

Bu, düzenli bir hiyerarşik sorguda yapılabilir olmalıdır - prosedür gerekmez. –