层级查询高级用法, 执行计划hash group by--工作备忘2016/02/02

1、

情况说明: 将层级关联查询出的结果,合并成一列。

方法说名: 在普通层级查询(start with connect by) 之上使用 sys_connect_by_path(para1,para2),参数1是要显示的字段,参数2是连接字段的分个符,

使用该函数可以将层级结果合并。

高级使用(工作中)只想显示特定的字段或者将多层树分成不同的列。

--可以配合case when语句只显示所需节点,然后加入多个sys_connect_by_path 是一整串节点分列显示

WITH employee_sales_area AS
 (SELECT /*+ materialize */
   aeh.id_head,
   MAX(CASE
           WHEN ae.type = '1' THEN
            1
           ELSE
            0
       END) AS flag_city_head,
   MAX(CASE
           WHEN ae.type = '2' THEN
            1
           ELSE
            0
       END) AS flag_province_head,
   MAX(CASE
           WHEN ae.type = '3' THEN
            1
           ELSE
            0
       END) AS flag_region_head
  FROM   owner_int.vd_hom_sales_area2head aeh ----fx, not in internal db
  LEFT   JOIN owner_int.vd_hom_sales_area ae ON ae.id = aeh.id_sales_area
                                         AND    ae.status = 'a'
  WHERE  trunc(SYSDATE) + 1 - (1 / 86400) BETWEEN aeh.valid_from AND nvl(aeh.valid_to, to_date('30000101', 'yyyymmdd'))
  GROUP  BY aeh.id_head)
SELECT id_emp,(CASE
                                    WHEN code_bank_role = 'sle' THEN
                                     id_emp
                                    ELSE
                                     NULL
                                END) AS id_emp_sales_leader ,
                                (CASE
                                    WHEN code_bank_role = 'sma' THEN
                                     id_emp
                                    ELSE
                                     NULL
                                END) AS id_emp_sales_manager,
                                (CASE
                                    WHEN code_bank_role = 'che' THEN
                                     id_emp
                                    WHEN code_bank_role = 'man'
                                         AND flag_city_head = 1 THEN
                                     id_emp
                                    ELSE
                                     NULL
                                END) AS id_emp_city_head,
       TRIM(sys_connect_by_path(/*CASE
                                    WHEN code_bank_role = 'sle' THEN*/
                                     id_emp
                                  /*  ELSE
                                     NULL
                                END,
                                ' '*/,' ')) AS id_emp_sales_leader1,
       TRIM(sys_connect_by_path(CASE
                                    WHEN code_bank_role = 'sma' THEN
                                     id_emp
                                    ELSE
                                     NULL
                                END,
                                ' ')) AS id_emp_sales_manager1,
       TRIM(sys_connect_by_path(CASE
                                    WHEN code_bank_role = 'che' THEN
                                     id_emp
                                    WHEN code_bank_role = 'man'
                                         AND flag_city_head = 1 THEN
                                     id_emp
                                    ELSE
                                     NULL
                                END,
                                ' ')) AS id_emp_city_head1

FROM   (SELECT emp.id_emp,
               emp.id_superior,
               emp.emp_name2          AS name_last,
               emp.bankrole_code      AS code_bank_role,
               sar.flag_city_head,
               sar.flag_province_head,
               sar.flag_region_head
        FROM   owner_int.vh_hom_employee emp
        LEFT   JOIN employee_sales_area sar ON sar.id_head = emp.id_emp
        WHERE  EMP.EMP_STATUS = 'a') e
WHERE  e.id_emp IN (142364, 182431)
START  WITH code_bank_role IN ('che')
CONNECT BY PRIOR id_emp = id_superior
               AND LEVEL <= 8;

参考资料:

sys_connect_by_path简单应用: http://blog.csdn.net/inthirties/article/details/4331685, http://www.cnblogs.com/huanghai223/archive/2010/12/10/1902696.html

其他相关函数用法 http://www.xuebuyuan.com/1580678.html,

http://blog.csdn.net/huangyunzeng2008/article/details/4799973,

http://my.oschina.net/kkrgwbj/blog/308311

CONNECT_BY_ROOT--查询每个分支的根节点



2、hash group by

如果执行计划最后group by是hash聚合且速度非常慢,可能是临时表空间不足导致,

该问题为oracle算法bug,偶然性发生,如何出现可使用

1)/*+no_use_hash_aggregation */

2)或者加上order by语句强行执行 sort group by



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值