为什么不把value直接放在t_Tree中呢?难道每个ID有多个Value?
如果是那样的话,你这个就比较复杂了,我给你一个方法:
在t_Tree中加一个分片号字段(string型,不可重复,也不可用简单的数字表示),级别越高分片号越少,如t_Tree中根结点分片号为FP00,它有两个明细分别是FP00FP01,FP00FP02,往下推的明细的分片号都包含父结点的分片号。这样你在做查询时只需要select * from …… where 分片号 like "自己分片号%"
就可以把所有明细都取出来了。
如果是那样的话,你这个就比较复杂了,我给你一个方法:
在t_Tree中加一个分片号字段(string型,不可重复,也不可用简单的数字表示),级别越高分片号越少,如t_Tree中根结点分片号为FP00,它有两个明细分别是FP00FP01,FP00FP02,往下推的明细的分片号都包含父结点的分片号。这样你在做查询时只需要select * from …… where 分片号 like "自己分片号%"
就可以把所有明细都取出来了。
解决方案 »
- plsql 触发器问题
- pb9.0连接oracle的问题
- vb连接oracle,执行一个复杂的存储过程,其间将vb进程手动杀死,oracle什么时候执行回滚?是马上执行还是插入完成后执行,还是别的时候
- 请高手帮忙看个Oracle权限的问题!谢谢!
- oracle9登录Enterprise Manager console要创建了资料库吗,可是oracle9没有-enterprise manager -configure assistant啊
- 求助:位与运算怎么表示??
- Oracle版权问题。
- 大家帮我看一下这句那儿有错误(在线等)
- 在NLS_LANG=WE8ISO8859P1,数据库字符集为UTF16的环境下用Oralce OLEDB操作汉字的朋友吗?
- 急:我安装了oracle的服务器,在网线有连接时一切正常,但拔下网线后,重新启动监听器,启动不了,并报错。
- oracle中的字符转义问题
- 通过触发器记录字段内容的前后修改情况,但是,
t_Tree(ID,Parent,Name)
t_Detail(ID,Value)
結果:
合计出每个节点下的所有明细(包括级联的)的Value疑問:
每個id有多個value明細嗎?如果只有一個,則可合并這兩個表。
關于樹行sql,可以看sql reference的Hierarchical Queries
SELECT employee_id, last_name, manager_id
FROM employees
CONNECT BY PRIOR employee_id = manager_id;
t_Tree(ID,Parent,Name,value)
select lpad(' ',level*2+length(Name),' ')||Name||'--'||value
from t_Tree
connect by prior id = Parent
start with Parent = 0; --从0开始两个表就会打断树型结构
t_Tree(ID,Parent,Name)
t_Detail(ID,Value)
作一个函数把所有value并在一起
t_Tree(ID,Parent,Name,value)
select lpad(' ',level*2+length(Name),' ')||Name||'--'||value
from t_Tree
connect by prior id = Parent
start with Parent = 0; --从0开始两个表就会打断树型结构
t_Tree(ID,Parent,Name)
t_Detail(ID,Value)
作一个函数把所有value并在一起
例如,t_Tree中有ID Parent Name
1 -1 A
2 1 B
3 1 C而t_Detail中有ID Parent Value
1 1 20
2 2 10
3 2 7
4 3 15则我的期望结果是A 52(=20+10+7+15)
B 17(=10+7)
C 15
select n,sum(v) over(order by n)
from (select a.name n,b.value v
from t_tree a,t_detail b where a.id = b.parent
group by a.name)
select n,sum(v) over(order by n)
from (select a.name n,sum(b.value) v
from t_tree a,t_detail b where a.id = b.parent
group by a.name)
select n,sum(v) over(order by n desc )
from (select a.name n,sum(b.value) v
from t_tree a,t_detail b where a.id = b.parent
group by a.name)
(select a.id,a.Parent,a.value,b.name from t_Detail a,t_Tree b where a.ID=b.id(+)) c
connect by prior c.id =c.Parent start with c.Parent =0查询语句大体是这样,但你的表数据最好是这样:
ID Parent Value
1 0 20
2 1 10
3 1 7
4 2 15
你的查询我试过了,语法有错,Oracle报ERROR 位于第 1 行: //第一行中的level
ORA-00937: 非单组分组函数另外,你提到表数据最好是你建议的那样,为什么呢?是t_Detail中的Parent取值应该这样,还是t_Tree中的Parent取值应该这样?我的解决方案如下:
写一个视图,先sum出树上每个节点的直接取值
create view v_Tree_Detail as
select a.Parent, a.ID, a.Name, sum(b.Value) Value
from t_Tree a, t_Detail b
where a.ID = b.Parent(+)
group by a.Parent, a.ID, a.name
/然后执行下面的SQL就可以统计出来了
select Parent, ID, lpad(' ', level * 2, ' ')||Name Name,
(select sum(value) value
from v_Tree_Detail
connect by prior ID = Parent
start with ID = c.ID) Value
from v_Tree_Detail c
connect by prior ID = Parent
start with Parent = -1;上面的查询中使用了一个子查询,可能对性能有影响。不知道有没有更好的方案?
欢迎大家发表意见。
SQL> select * from t_Detail;ID PARENT VALUE NAME
-- ------ ---------- ----------
1 0 20 a
2 1 10 b
3 1 7 c
4 2 15 SQL> select name,(select sum(value) from t_detail start with Parent=a.Parent connect by prior id =Parent) value from t_Detail a;NAME VALUE
---------- ----------
a 52
b 32
c 32
15
就算我这里能做成一个表,但跟其它业务联系起来的时候,也会出现我提到的结构啊!例如一棵商品树(t_Tree),每种商品的销售记录(t_Detail)。这样在t_Detail中ID表示销售流水号,Parent表示商品,Value表示销售数量
另外,你的做法跟我的思路核心是一样的了,但我测试时有个麻烦事:t_detail中有大约500,000条记录,统计需要4~5分钟才能得到结果。但我执行以下语句时却只需要最多只需要11~13秒:select * from v_Tree_Detail有没有办法优化一下这个查询,让它执行子查询的时候只在第一次从数据库中读取数据,而在以后都只在已经取出来的数据中查找和匹配。
需要优化