【问题标题】:Hierarchical Query Needs to Pull Children, Parents and Siblings分层查询需要拉取子、父、兄弟
【发布时间】:2012-11-19 06:35:48
【问题描述】:

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

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

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

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

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

任何见解将不胜感激。

【问题讨论】:

  • 如果您费力地创建了一个小提琴,那么一个链接会很方便。
  • 是的,这有助于清楚。因此,这是您第三次向要提取的内容添加新信息。算了。
  • 看起来很有趣。还有人感兴趣吗?

标签: sql oracle hierarchy connect-by


【解决方案1】:

这样做的关键在于“递归”这个词。为此,请创建一个调用自身的过程。这是父母的示例,但因为它使用光标滚动条目,所以如何使用它来查找子项和其他涉及递归的关系应该很简单。

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;

【讨论】:

  • 这在常规分层查询中应该是可行的 - 不需要过程。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2023-03-13
    相关资源
    最近更新 更多