Oracle 分层查询 - 组合结果
Oracle hierarchical query - combine results
给定一个 table:
Old_ID New_ID
A B
B C
多次ID变化可以形成链A->B->C,我可以做分层查询
SELECT Old_ID, New_ID from mytable
CONNECT BY PRIOR New_ID = Old_ID
因为 C 是 A 和 B 的有效新 ID,所以我想得到的结果是:
Old_ID New_ID
A C
B C
因此将所有旧 ID 映射到链中最新的新 ID。
结合使用 CONNECT_BY_ROOT( old_id )
和 WHERE CONNECT_BY_ISLEAF = 1
来查找层次结构中的最后一项:
Oracle 11g R2 架构设置:
CREATE TABLE your_table( Old_ID, New_ID ) As
SELECT 'A', 'B' FROM DUAL UNION ALL
SELECT 'B', 'C' FROM DUAL;
查询 1:
SELECT CONNECT_BY_ROOT( old_id ) AS old_id,
new_id
FROM your_table
WHERE CONNECT_BY_ISLEAF = 1
CONNECT BY PRIOR New_ID = Old_id
| OLD_ID | NEW_ID |
|--------|--------|
| A | C |
| B | C |
给定一个 table:
Old_ID New_ID
A B
B C
多次ID变化可以形成链A->B->C,我可以做分层查询
SELECT Old_ID, New_ID from mytable
CONNECT BY PRIOR New_ID = Old_ID
因为 C 是 A 和 B 的有效新 ID,所以我想得到的结果是:
Old_ID New_ID
A C
B C
因此将所有旧 ID 映射到链中最新的新 ID。
结合使用 CONNECT_BY_ROOT( old_id )
和 WHERE CONNECT_BY_ISLEAF = 1
来查找层次结构中的最后一项:
Oracle 11g R2 架构设置:
CREATE TABLE your_table( Old_ID, New_ID ) As
SELECT 'A', 'B' FROM DUAL UNION ALL
SELECT 'B', 'C' FROM DUAL;
查询 1:
SELECT CONNECT_BY_ROOT( old_id ) AS old_id,
new_id
FROM your_table
WHERE CONNECT_BY_ISLEAF = 1
CONNECT BY PRIOR New_ID = Old_id
| OLD_ID | NEW_ID |
|--------|--------|
| A | C |
| B | C |