[英]Hierarchical queries
我創建了某種“依賴項”表,其中包含了我們夜間流程的所有依賴項。
該表如下所示:
GRAND_MODEL | WAIT_4_MODEL_NAME
test test1
test test2
test test3
test2 test3
test3 test4
test4 test5
該表意味着-> test
為了完成需要等待test1
, test2
, test3
,但它也需要等待test4
和test5
,因為test3/4
等待它們。 test1
不等待任何東西, test2
等待test3
,因此也等待test4
,因此也等待test5
。
因此結果應如下所示:
FIRST_MODEL | SECOND_MODEL | THIRD_MODEL | FORTH_MODEL | FIFTH_MODEL | SIXTH_MODEL
test5 test4 test3 test2 test NULL
test5 test4 test3 test NULL NULL
test4 test3 test2 test NULL NULL
.................................
我嘗試過的
SELECT distinct prior wait_4_model_name as first_m,
wait_4_model_name as second_m,
grand_model as third_m
from (SELECT distinct grand_model, wait_4_model_name
FROM DEL_SAGI_FOR_HIERARCHY)
connect by NOCYCLE prior grand_model = wait_4_model_name
但這只會生成層次結構的第一級。
提前致謝。
編輯:請注意,可以有相反的依賴關系, test
等待test1
和test1
等待test
(每個模型都很大,因此該模型的一部分有可能等待另一個模型的一部分)
Oracle安裝程序 :
CREATE TABLE table_name ( GRAND_MODEL, WAIT_4_MODEL_NAME ) AS
SELECT 'test', 'test1' FROM DUAL UNION ALL
SELECT 'test', 'test2' FROM DUAL UNION ALL
SELECT 'test', 'test3' FROM DUAL UNION ALL
SELECT 'test2', 'test3' FROM DUAL UNION ALL
SELECT 'test3', 'test4' FROM DUAL UNION ALL
SELECT 'test4', 'test5' FROM DUAL;
查詢 :
SELECT REGEXP_SUBSTR( tests, '[^|]+', 1, 1 ) AS first_model,
REGEXP_SUBSTR( tests, '[^|]+', 1, 2 ) AS second_model,
REGEXP_SUBSTR( tests, '[^|]+', 1, 3 ) AS third_model,
REGEXP_SUBSTR( tests, '[^|]+', 1, 4 ) AS fourth_model,
REGEXP_SUBSTR( tests, '[^|]+', 1, 5 ) AS fifth_model,
REGEXP_SUBSTR( tests, '[^|]+', 1, 6 ) AS sixth_model,
REGEXP_SUBSTR( tests, '[^|]+', 1, 7 ) AS seventh_model,
REGEXP_SUBSTR( tests, '[^|]+', 1, 8 ) AS eighth_model,
REGEXP_SUBSTR( tests, '[^|]+', 1, 9 ) AS ninth_model
FROM (
SELECT SYS_CONNECT_BY_PATH( wait_4_model_name, '|' ) || '|' || grand_model AS tests
FROM table_name
CONNECT BY PRIOR grand_model = wait_4_model_name
);
輸出 :
FIRST_MODEL SECOND_MODEL THIRD_MODEL FOURTH_MODEL FIFTH_MODEL SIXTH_MODEL SEVENTH_MODEL EIGHTH_MODEL NINTH_MODEL
----------- ------------ ----------- ------------ ----------- ----------- ------------- ------------ -----------
test1 test
test2 test
test3 test
test3 test2
test3 test2 test
test4 test3
test4 test3 test
test4 test3 test2
test4 test3 test2 test
test5 test4
test5 test4 test3
test5 test4 test3 test
test5 test4 test3 test2
test5 test4 test3 test2 test
這是不需要字符串連接和重新分割的解決方案:
select a.wait_4_model_name model1,
a.grand_model model2,
b.grand_model model3,
c.grand_model model4,
d.grand_model model5,
e.grand_model model6
from DEL_SAGI_FOR_HIERARCHY a
left join DEL_SAGI_FOR_HIERARCHY b ON a.grand_model = b.wait_4_model_name
left join DEL_SAGI_FOR_HIERARCHY c ON b.grand_model = c.wait_4_model_name
left join DEL_SAGI_FOR_HIERARCHY d ON c.grand_model = d.wait_4_model_name
left join DEL_SAGI_FOR_HIERARCHY e ON d.grand_model = e.wait_4_model_name
where a.wait_4_model_name not in (
select grand_model from DEL_SAGI_FOR_HIERARCHY)
order by 1, 2, 3, 4, 5, 6
樣本數據的輸出為:
+--------+--------+--------+--------+--------+--------+
| MODEL1 | MODEL2 | MODEL3 | MODEL4 | MODEL5 | MODEL6 |
+--------+--------+--------+--------+--------+--------+
| test1 | test | - | - | - | - |
| test5 | test4 | test3 | test | - | - |
| test5 | test4 | test3 | test2 | test | - |
+--------+--------+--------+--------+--------+--------+
請注意,您的樣本數據沒有完全沒有任何依賴關系的模型實例,即不需要等待其他模型,也不需要任何模型在啟動之前就不需要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.