2012-12-01 65 views
5

現在可以拉數據,但是想知道是否有更好的方法來優化大數據集的查詢。分層查詢需要拉動兒童,父母和兄弟

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

所以基本上我希望能夠提供查詢給定的組織ID,並把它拉遞歸其母公司,它的孩子,它的兄弟姐妹和叔叔阿姨。然後拉取與該組織結構關聯的任何活動。

Org1是頂級組織,但它可能有或沒有空父代。

基本上我正在做一個向上和向下查詢拉兒童和父母,但似乎只能通過添加另一個查詢得到兄弟姐妹。最後在朋友的幫助下得到另一個查詢,但在大數據集(活動4-5k)上非常低。

任何有識之士將不勝感激。

+0

如果您在創建小提琴時遇到了麻煩,鏈接將很方便。 – Laurence

+0

對不起。 http://sqlfiddle.com/#!4/5310d/5/0 –

+0

雅,它有助於清楚。因此,這是您第三次將新信息添加到您想要的內容中。算了吧。 – REW

回答

0

如果您的組織結構是嚴格分層次的,那麼你可以使用這種方法: http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html

缺點是你必須更新每個更新的組織結構的索引。然而,組織結構通常會被更多地閱讀並修改。所以恕我直言,這應該做的伎倆。

0

這樣做的關鍵在於「遞歸地」這個詞。爲此,創建一個自己調用的過程。這是父母的一個例子,但是因爲它使用光標來滾動條目,所以如何使用它來查找涉及遞歸的兒童和其他關係應該很簡單。

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

這在常規的分層查詢中應該是可行的 - 不需要任何程序。 –

相關問題