分层查询需要拉动孩子,父母和兄弟姐妹

时间:2012-12-01 01:15:27

标签: sql oracle hierarchy connect-by

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

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

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

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

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

非常感谢任何见解。

2 个答案:

答案 0 :(得分:0)

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

缺点是您必须在每次更新组织结构时更新索引。然而,组织结构通常更频繁地被读取然后被修改。所以恕我直言,这应该可以解决问题。

答案 1 :(得分: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;