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