如何收集分层数据项并根据其依赖关系构建树

时间:2015-06-26 15:09:11

标签: sql firebird

有一个包含分层数据的表,例如:

| table "attribute_instances"                           |
+----+----------+------------+---------------+----------+
| id | tree_ref | parent_ref | attribute_ref | data_ref |
+----+----------+------------+---------------+----------+
|  1 |        1 |         -1 |             1 |        1 |
|  2 |        1 |          1 |             2 |        2 |
|  3 |        2 |         -1 |             1 |        3 |
|  4 |        2 |          3 |             2 |        2 |

它包含许多单独的树(请参阅tree_ref),每个树都实例化一些属性(请参阅attribute_ref)并具有数据引用data_reference,其中数据可能在其他树中引用也是。

现在,这些树应该合并到一个树中,其中(到现在为止)最多可以选择5个属性作为该树的级别,例如:

attribute => level
------------------
        2 =>     1
        1 =>     2

我需要的是一个或多个查询,它们从表attribute_instances收集数据并给出如下结果:

| table "merged_attribute_instances"         |
+----+------------+---------------+----------+
| id | parent_ref | attribute_ref | data_ref |
|  5 |         -1 |             2 |        2 |
|  6 |          5 |             1 |        1 |
|  7 |          5 |             1 |        3 |

这是所需的合并树:

id:5 - data_ref:2
  id:6 - data_ref:1
  id:7 - data_ref:3

注意,attribute_ref = 2在结果树中只出现一次,因为它的所有实例都具有相同的data_ref值(即2)。

我尝试了一些像

这样的连接
select *
  from attribute_instances a
  join attribute_instances b on a.tree_ref = b.tree_ref

但是,对我而言,用户定义的树深度似乎很糟糕。我确信有更好的解决方案。

更新:我应该补充一下,表merged_attribute_instances是一个临时表。收集查询使用for..do进行迭代。在循环中,收集的attribute_instances然后被添加到临时表中。

1 个答案:

答案 0 :(得分:0)

好的,然后使用它:

SET TERM ^ ;

create or alter procedure GETTREENODES
returns (
    ID integer,
    TREE_REF integer,
    PARENT_REF integer,
    ATTRIBUTE_REF integer,
    DATA_REF integer)
as
declare variable DATAREFEXISTS varchar(4096);
begin
 DATAREFEXISTS = ',';
 for
    Select id, tree_ref, parent_ref, attribute_ref, data_ref from attribute_instances
     into :id, :tree_ref, :parent_ref, :attribute_ref, :data_ref
 do begin
    IF (position(',' || data_ref || ',', DATAREFEXISTS) =0) THEN
    begin
      suspend;
      DATAREFEXISTS = DATAREFEXISTS || data_ref || ',' ;
    end
 end
end^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON ATTRIBUTE_INSTANCES TO PROCEDURE GETTREENODES;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE GETTREENODES TO SYSDBA;

这样称呼:

Select * from gettreenodes
order by tree_ref, parent_ref