層級查詢高級用法, 執行計劃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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章