2014-02-20 45 views
0

我有一個HierarchyMaster_idSub_id創建自定義函數或存儲過程

sub_id Master_id 
2  1 
3  2 
4  1 
5  3 
6  7 

我想創建一個迭代函數或存儲過程(我不知道我從來沒有使用過任何人之前)來創建一個多個列,給了我的primary_master_Column(PMC)

sub_id Master_id PMC 
2  1   1 
3  2   1 
4  1   1 
5  3   1 
6  7   7 
+1

這uncleart給我你想要什麼。 –

+0

對不起,我重命名了我的表中的列。在我的表3中是2的子公司,但2又是1的子公司。所以我想要一個單獨的列,它將列出層次結構頂部的id。希望現在清除 – avg998877

回答

2
select 
    Master_id, sub_id, 
    max(PMC) keep(dense_rank first order by lev desc) as PMC 
from 
(
select 
    sub_id as PMC, level lev, 
    connect_by_root(Master_id) as Master_id, 
    connect_by_root(sub_id) as sub_id 
from your_table 
connect by prior sub_id = Master_id 
) 
group by Master_id, sub_id 

fiddle

+0

非常感謝您的幫助 – avg998877

2

SQL Fiddle

的Oracle 11g R2架構設置

CREATE TABLE test (sub_id, Master_id) AS 
      SELECT 2,  1 FROM DUAL 
UNION ALL SELECT 3,  2 FROM DUAL 
UNION ALL SELECT 4,  1 FROM DUAL 
UNION ALL SELECT 5,  3 FROM DUAL 
UNION ALL SELECT 6,  7 FROM DUAL; 

查詢1

SELECT t.sub_id, 
     t.master_id, 
     CONNECT_BY_ROOT(t.master_id) AS PMC 
FROM test t 
     LEFT OUTER JOIN 
     test x 
     ON (t.master_id = x.sub_id) 
START WITH x.sub_id IS NULL 
CONNECT BY PRIOR t.sub_id = t.master_id 

Results

| SUB_ID | MASTER_ID | PMC | 
|--------|-----------|-----| 
|  2 |   1 | 1 | 
|  3 |   2 | 1 | 
|  5 |   3 | 1 | 
|  4 |   1 | 1 | 
|  6 |   7 | 7 | 

查詢2

SELECT t.sub_id, 
     t.master_id, 
     CONNECT_BY_ROOT(t.master_id) AS PMC 
FROM test t 
START WITH NOT EXISTS (SELECT 'x' FROM test x WHERE t.master_id = x.sub_id) 
CONNECT BY PRIOR t.sub_id = t.master_id 

Results

| SUB_ID | MASTER_ID | PMC | 
|--------|-----------|-----| 
|  2 |   1 | 1 | 
|  3 |   2 | 1 | 
|  5 |   3 | 1 | 
|  4 |   1 | 1 | 
|  6 |   7 | 7 | 
+0

感謝您對此的支持。我將嘗試使用CONNECT BY – avg998877

+0

來解決此問題。您能否解釋爲什麼您使用的是PRIOR DBMS_RANDOM.VALUE IS NOT NULL條件? ?..謝謝,AVG – avg998877

+0

這是數據中的[用於停止循環](https://community.oracle.com/thread/2191579?tstart=0) - 當我編寫查詢的第一個草稿時,它是必需的包括它,但我隨後在'START WITH'語句中添加了,現在'AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL'是多餘的,可以刪除。我會將其編輯出來,以免混淆。 – MT0