我是菜鸟,存储过程不是很熟。
请问一下,存储过程处理是否比start with connect by prior这个快?还是因为在关联时影响性能?用存储过程分步进临时表是不是很快?
其实我也觊觎存储过程很久了,可惜门槛太高,能力有限啊,唉还是希望能有高手给个sql语句的
不行我只有啃那本厚厚的存储过程书了
可是这个项目估计。
帮忙啊~~

解决方案 »

  1.   

    9i的话,试一下SYS_CONNECT_BY_PATH(empno,'/') 函数是否好用
    try:
    select SYS_CONNECT_BY_PATH(id,'/') from  tree  start  with  id<> 0 connect  by  prior  id=pid;
      

  2.   

    谢谢bzszp的提示
    不过我怎么想也无法将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写法吧,高手们教教我呀~~~
      

  3.   

    select id,pid,level,SYS_CONNECT_BY_PATH(id, '/')
      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
      

  4.   

    不好意思最近太忙,没什么时间上论坛select * from tree    ID PID NAME ORDERNUM
    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
      

  5.   

    try:
    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));
      

  6.   

    http://community.csdn.net/Expert/topic/3448/3448087.xml?temp=.6614649
    请bzszp到上面贴接另外100分ps:
    10g里面好像添加了几个类似的函数,可能也能用得上
      

  7.   

    首先构造一个1000条的树表tree    ID PID NAME ORDERNUM
    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