我是菜鸟,存储过程不是很熟。
请问一下,存储过程处理是否比start with connect by prior这个快?还是因为在关联时影响性能?用存储过程分步进临时表是不是很快?
其实我也觊觎存储过程很久了,可惜门槛太高,能力有限啊,唉还是希望能有高手给个sql语句的
不行我只有啃那本厚厚的存储过程书了
可是这个项目估计。
帮忙啊~~
请问一下,存储过程处理是否比start with connect by prior这个快?还是因为在关联时影响性能?用存储过程分步进临时表是不是很快?
其实我也觊觎存储过程很久了,可惜门槛太高,能力有限啊,唉还是希望能有高手给个sql语句的
不行我只有啃那本厚厚的存储过程书了
可是这个项目估计。
帮忙啊~~
解决方案 »
- 如何在ORACLE中定义一个函数,固定返回一个字符串如('0501','0502','0503','0507','0542','0543')
- authorware连接Oracle问题
- 一台Server能同时支持9i的INet和10G的INet Connection么?
- ASP向oracle数据库插入自动编号问题
- 同一数据库不同的表里可以有 相同名字而含义不同的字段么?
- 急求救:改动init.ora文件,8i就无法启动
- 请教:使用system用户以sysdba登录出现问题
- 怎样修改参数文件
- 求救,请大侠指教。关于动态决定一个检索条件
- General SQL error ORA-061631:表121.main 达到MAX #extents(dd)
- 存储过程的问题
- raw类型的字段可以查询或者关联么?该怎么做?
try:
select SYS_CONNECT_BY_PATH(id,'/') from tree start with id<> 0 connect by prior id=pid;
不过我怎么想也无法将SYS_CONNECT_BY_PATH应用到这个实际问题中去
可能是我脑袋太笨了吧我想问一下
select (some value) value, sum(some sum use condition value) from table
有没有其他Oracle语法
就像上面我写的
select t.*,(select sum(pid) from tree start with id=t.id connect by prior id=pid and id!=0) pid_sum,(select sum(ordernum) from tree start with id=t.id connect by prior id=pid and id!=0) ordernum_sum from tree t
pid_sum和ordernum_sum使用外面查询的t.id作为条件作sum。两个查询是一样的,可是不能写在一起,是不是影响性能了?
应该有其他Oracle写法吧,高手们教教我呀~~~
from tree
start with id <> 0
connect by prior id = pid; ID PID LEVEL SYS_CONNECT_BY_PATH(ID,'/')
1 1 0 1 /1
2 4 1 2 /1/4
3 9 4 3 /1/4/9
4 13 9 4 /1/4/9/13
5 14 9 4 /1/4/9/14
6 15 9 4 /1/4/9/15
7 10 4 3 /1/4/10
8 11 4 3 /1/4/11
9 12 4 3 /1/4/12
10 5 1 2 /1/5
11 6 1 2 /1/6
12 2 0 1 /2
13 7 2 2 /2/7
14 3 0 1 /3
15 8 3 2 /3/8
16 4 1 1 /4
17 9 4 2 /4/9
18 13 9 3 /4/9/13
19 14 9 3 /4/9/14
20 15 9 3 /4/9/15
21 10 4 2 /4/10
22 11 4 2 /4/11
23 12 4 2 /4/12
24 5 1 1 /5
25 6 1 1 /6
26 7 2 1 /7
27 8 3 1 /8
28 9 4 1 /9
29 13 9 2 /9/13
30 14 9 2 /9/14
31 15 9 2 /9/15
32 10 4 1 /10
33 11 4 1 /11
34 12 4 1 /12
35 13 9 1 /13
36 14 9 1 /14
37 15 9 1 /15
1 0 0 根
2 1 0 a 1
3 2 0 b 3
4 3 0 c 2
5 4 1 aa 3
6 5 1 ab 4
7 6 1 ac 1
8 7 2 ba 2
9 8 3 ca 3
10 9 4 aaa 4
11 10 4 aab 5
12 11 4 aac 3
13 12 4 aad 2
14 13 9 aaaa 3
15 14 9 aaab 2
16 15 9 aaac 5
select substr(tre,2,instr(tre,'/',1,2)) id,count(*) col1,sum(pid) col2,
sun(orderno) col3 from (
select id,pid,level,SYS_CONNECT_BY_PATH(id, '/')||'/' tre
from tree
start with id <> 0
connect by prior id = pid) t group by substr(tre,2,instr(tre,'/',1,2));
请bzszp到上面贴接另外100分ps:
10g里面好像添加了几个类似的函数,可能也能用得上
1 1 0 a 0.403468943688991
2 2 0 b 0.0307471372975998
3 3 0 c 0.129061343338368
4 4 1 aa 0.0425741518032621
5 5 1 ab 0.139388226523696
6 6 1 ac 0.8301643248385
7 7 2 ba 0.357315896107927
8 8 2 bb 0.130836505477201
9 9 2 bc 0.280503854254622
10 10 4 aaa 0.0629049764651892
11 11 4 aab 0.488475723593839
12 12 4 aac 0.785707959966295
13 13 10 aaaa 0.0484341140683424
14 14 10 aaab 0.136465921100681
15 15 13 a 0.939184083338079insert into tree (select * from tree)
最后的ordernum使用dbms_random.value灌注的数据
保证一定的深度一,单条嵌入统计
select t.*,
(select count(*)
from tree
start with id = t.id
connect by prior id = pid and id != 0)
from tree t33 seconds二,多条嵌入统计
select t.*,
(select sum(pid)
from tree
start with id = t.id
connect by prior id = pid and id != 0) pid_sum,
(select sum(ordernum)
from tree
start with id = t.id
connect by prior id = pid and id != 0) ordernum_sum
from tree t67 seconds三,SYS_CONNECT_BY_PATH分组统计
select substr(tre, 1, instr(tre, '/', 2)) id,
count(*) col1,
sum(pid) col2,
sum(ordernum) col3
from (select id,
pid,
ordernum,
level,
SYS_CONNECT_BY_PATH(id, '/') || '/' tre
from tree
start with id != 0
connect by prior id = pid) t
group by substr(tre, 1, instr(tre, '/', 2));4.61 seconds四,简单SYS_CONNECT_BY_PATH查询
select SYS_CONNECT_BY_PATH(id, '/')
from tree
start with id != 0
connect by prior id = pid4.516 seconds