我有一個Hierarchy
表Master_id
和Sub_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
我有一個Hierarchy
表Master_id
和Sub_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
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
非常感謝您的幫助 – avg998877
的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
| 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
| SUB_ID | MASTER_ID | PMC |
|--------|-----------|-----|
| 2 | 1 | 1 |
| 3 | 2 | 1 |
| 5 | 3 | 1 |
| 4 | 1 | 1 |
| 6 | 7 | 7 |
感謝您對此的支持。我將嘗試使用CONNECT BY – avg998877
來解決此問題。您能否解釋爲什麼您使用的是PRIOR DBMS_RANDOM.VALUE IS NOT NULL條件? ?..謝謝,AVG – avg998877
這是數據中的[用於停止循環](https://community.oracle.com/thread/2191579?tstart=0) - 當我編寫查詢的第一個草稿時,它是必需的包括它,但我隨後在'START WITH'語句中添加了,現在'AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL'是多餘的,可以刪除。我會將其編輯出來,以免混淆。 – MT0
這uncleart給我你想要什麼。 –
對不起,我重命名了我的表中的列。在我的表3中是2的子公司,但2又是1的子公司。所以我想要一個單獨的列,它將列出層次結構頂部的id。希望現在清除 – avg998877