2012-12-01 40 views
5

Bây giờ có thể lấy dữ liệu, nhưng tôi tự hỏi liệu có cách nào tốt hơn để tối ưu hóa truy vấn cho các tập dữ liệu lớn hay không.Nhu cầu truy vấn phân cấp để kéo trẻ em, cha mẹ và anh chị em

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

Vì vậy, về cơ bản tôi muốn để có thể cung cấp các truy vấn một id org nhất định và có nó đệ quy kéo cha mẹ của mình, con của nó, anh chị em của mình và cô dì và chú bác của mình. Và sau đó kéo bất kỳ Hoạt động nào được liên kết với phân cấp tổ chức đó.

Org1 là tổ chức cấp cao nhất, nhưng có thể hoặc không có cha mẹ trống.

Về cơ bản, tôi đã thực hiện truy vấn lên và xuống để kéo các con và phụ huynh, nhưng chỉ có thể có được các anh chị em bằng cách thêm một truy vấn khác. Cuối cùng đã đến một truy vấn khác với sự giúp đỡ của một người bạn, nhưng nó rất thấp trên bộ dữ liệu lớn (4-5k hoạt động).

Mọi thông tin chi tiết sẽ được đánh giá cao.

+0

Nếu bạn gặp khó khăn trong việc tạo một fiddle, một liên kết sẽ rất tiện lợi. – Laurence

+0

Xin lỗi về điều đó. http://sqlfiddle.com/#!4/5310d/5/0 –

+0

Ya, điều này giúp làm rõ. Do đó, đây là lần thứ ba bạn thêm thông tin mới vào những gì bạn muốn kéo. Quên đi. – REW

Trả lời

0

Nếu tổ chức của bạn. cấu trúc hoàn toàn phân cấp, sau đó bạn có thể sử dụng phương pháp này: http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html

Hạn chế là bạn phải cập nhật chỉ mục trên mọi cập nhật cấu trúc tổ chức. Tuy nhiên các cấu trúc org thường được đọc nhiều hơn sau đó được sửa đổi. Vì vậy, IMHO này nên làm các trick.

0

Chìa khóa để thực hiện điều này là trong từ "đệ quy". Để làm điều đó, hãy tạo một thủ tục tự gọi. Đây là một ví dụ cho cha mẹ, nhưng bởi vì nó sử dụng một con trỏ để di chuyển qua các mục, nó nên được đơn giản để làm thế nào để sử dụng điều này để tìm trẻ em và các mối quan hệ khác liên quan đến đệ quy.

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

Điều này sẽ khả thi trong truy vấn phân cấp thường xuyên - không cần thủ tục. –

Các vấn đề liên quan