有一个包含分层数据的表,例如:
| 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
然后被添加到临时表中。
答案 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