5

现在可以拉数据,但想知道是否有更好的方法来优化大型数据集的查询。

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

所以基本上我希望能够为查询提供给定的 org id 并让它递归地拉出它的父母、孩子、兄弟姐妹和叔叔阿姨。然后拉取与该组织层次结构关联的任何活动。

Org1 是顶级组织,但它可能有也可能没有 null 父级。

基本上我正在做一个上下查询来拉孩子和父母,但似乎只能通过添加另一个查询来获得兄弟姐妹。终于在朋友的帮助下进行了另一个查询,但它在大型数据集(4-5k 的活动)上非常低。

任何见解将不胜感激。

4

2 回答 2

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;
于 2014-04-29T00:32:59.810 回答
0

如果你的组织。结构是严格分层的,那么您可以使用这种方法: http ://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html

缺点是您必须在每次更新组织结构时更新索引。然而,组织结构的阅读频率通常要高得多,然后再进行修改。所以恕我直言,这应该可以解决问题。

于 2013-02-15T14:03:01.237 回答