分层查询需要获取子节点、父节点和兄弟节点

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

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

基本上,我希望能够提供给查询一个给定的组织ID,并递归地获取其父级、子级、兄弟姐妹和叔伯姑婆。然后获取与该组织层次结构相关联的任何活动。
Org1是最高级别的组织,但它可能有空父级。
基本上,我正在进行向上和向下查询以获取子级和父级,但只能通过添加另一个查询来获取兄弟姐妹。最终在朋友的帮助下找到了另一个查询,但对于大数据集(4-5k个活动)来说效率很低。
任何见解都将不胜感激。

如果您已经费心创建了一个fiddle,那么提供一个链接会很方便。 - Laurence
抱歉,这是链接 http://sqlfiddle.com/#!4/5310d/5/0 - Gabe Ortiz
是的,保持清晰有帮助。因此,这已经是第三次您添加了新信息到您想要提取的内容中了。算了。 - REW
看起来很有趣。还有人感兴趣吗? - Andrew Wolfe
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;

这在一个普通的分层查询中是可行的 - 不需要过程。 - Andrew Wolfe

0
如果您的组织结构是严格的层次结构,那么您可以使用以下方法: http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html 缺点是您必须在每次更新组织结构时更新索引。但是,组织结构通常被读取的频率比修改的频率要高得多。因此,在我看来,这应该能解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接